Bowmark
Server Details
Do things on live websites: prices, availability, quotes, bookings, anything behind a form or login.
- Status
- Healthy
- Uptime
- 99.9% over 64 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- bowmark-ai/skill
- GitHub Stars
- 0
TDQS
Scored across 13 tools
Each tool targets a distinct resource+action, and the descriptions explicitly draw the boundaries for the few overlapping clusters (e.g. add_connection vs logout_connection vs delete_connection vs list_connections, and the secret tools). The only near-noop is run_view, which is clearly marked as unnecessary to call.
Almost all tools follow a clean snake_case verb_noun pattern (add_connection, list_connections, request_secret, get_library, lease_ip, wait_for_sign_in). A few deviations — bare verbs report/run and the noun-style run_view — slightly break the rhythm but remain readable.
13 tools is well within the healthy 3-15 range for a platform covering connections, secrets, IP leasing, script execution and feedback. run_view is essentially noise from an agent's perspective, but the set is otherwise tight.
The connection lifecycle (list/add/logout/delete) and secrets flow (list/request/get_link) are well covered, along with run, library lookup, IP leasing and reporting. Minor gaps exist: no tool to release a leased IP and no tool to delete a secret, both of which fall back to the dashboard.
Available Tools
13 toolsadd_connectionGet the user a link to sign Bowmark in to a siteAInspect
Get a sign-in link for one site, so the user can sign Bowmark in to it right now, before any run needs it. Pass the site as a domain (youtube.com), a URL, or a provider id. Call this whenever the user asks to log in, sign in, connect or link an account on a site — never send them to the Bowmark Link extension or the dashboard to do it themselves.
It returns url, a single-use link that expires (expiresAt). Give the user that URL and say which site it is for. On that page they sign in with Bowmark's own browser, or, in desktop Chrome with Bowmark Link installed, press "Use Chrome extension" to send the login that Chrome already holds. Then call wait_for_sign_in with the returned ref: it answers the moment they finish, and every later run uses the new login.
When Bowmark cannot sign in to that site, it says so and returns sites, the sites it can sign in to. Tell the user plainly. Do not offer a workaround that asks for their password. A public page on that site still works without a login: get_library shows what can read it.
To sign back in to a saved login that stopped working, pass its id from list_connections as connection. The fresh session goes into the SAME id.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The site to sign in to: a domain (`youtube.com`), a URL, its name, or a provider id. | |
| connection | No | Optional. The `id` of a saved login from `list_connections`, to sign back in to it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering safety traits, the description adds substantial behavioral context: the return value is a single-use expiring URL, the user signs in on that page, wait_for_sign_in completes the flow, failures return a list of supported sites, and re-signing in targets the same connection id.
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 purpose and trigger are front-loaded, and the multi-paragraph structure follows the workflow logically. It is longer than necessary but most sentences carry actionable detail for a complex sign-in flow.
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?
There is no output schema, so the description must explain return values; it does so with url and expiresAt. It also covers failure behavior, the next step with wait_for_sign_in, and the saved-login case, which is complete for this 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. The description adds meaning by explaining the connection parameter’s use case: signing back in to a saved login that stopped working, with the fresh session going into the same id.
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: get a sign-in link for one site. It distinguishes this tool from sibling tools by explaining that wait_for_sign_in is called afterward and that the user should not be sent to the extension or dashboard.
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 triggers: call whenever the user asks to log in, sign in, connect, or link an account on a site. It also states when not to use it, names the follow-up tool, handles the saved-login case, and explains failure behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_connectionAsk the user to confirm deleting a saved loginARead-onlyIdempotentInspect
Start deleting a saved login by the id list_connections returned. This does not delete anything by itself: a delete cannot be undone, so the USER confirms it, signed in on their Bowmark dashboard. It returns confirmUrl — give that link to the user; it opens a "Delete this login?" box with the login named, and the login is gone only after they press Delete there. Nothing you can call completes it for them.
Only call this when the user asked to remove a saved login. To sign out of a site, use logout_connection instead. Never call it to "fix" a connection that is merely stale — needs_reauth/expired recover with a new sign-in, which refreshes the SAME login in place and needs no confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The connection `id` from `list_connections`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly/idempotent/non-destructive; the description adds the crucial two-step semantics that annotations cannot express — it deletes nothing itself, a human must confirm on the dashboard, the returned `confirmUrl` is the only path to completion, and no call can finish it programmatically. It also flags irreversibility, which reconciles the surprising destructiveHint=false.
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?
Front-loads the most decision-relevant fact ("This does not delete anything by itself") before anything else, and every following sentence carries a distinct load: the confirmation flow, the return value, the trigger condition, and two exclusion rules. No filler.
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-initiation tool with no output schema, the description supplies everything needed: the return value (`confirmUrl`), what the user must do with it, the irreversibility, and the routing rules against siblings. Nothing an agent needs to call it correctly is missing.
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 100% and the schema already documents that `id` is the connection id from `list_connections`, so the description largely restates it. The single-parameter baseline of 3 is appropriate; no format or edge-case guidance is added beyond the source 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?
States a precise verb and resource ("Start deleting a saved login") plus the identifier source, and explicitly distinguishes itself from siblings `list_connections` (source of the id) and `logout_connection` (the sign-out alternative). An agent can tell exactly what this does and does not do without opening any 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?
Gives an explicit when-to-use condition ("Only call this when the user asked to remove a saved login"), names the alternative for a different intent (`logout_connection` for signing out), and states a negative case ("Never call it to 'fix' a connection that is merely stale") with the reasoning that `needs_reauth`/`expired` self-heal via sign-in.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_libraryCheck what Bowmark can do for this taskARead-onlyInspect
Use this whenever a task touches a live website. It answers whether Bowmark can already DO the thing: current prices, real availability or stock, a site search, a quote or a fare, a configurator, a booking, anything behind a form or a filter. Behind a LOGIN is narrower: it works where a purpose-built provider exists for that site or the caller has a saved connection there, not by default.
Use this for Bowmark questions too. Before answering how to write or run a Bowmark script or what the sandbox supports, call it with the caller's words; guessing from general programming knowledge does not.
Checking is cheap, so check. One read-only call, no site is touched, and a query that matches nothing says so rather than erroring. If nothing fits, you have lost one cheap call and can use your normal approach.
Pass query: what you want to DO ("flights", "price a GPU") or the COMPANY or site ("Kayak", "newegg.com"). Only a HOSTNAME settles whether one site is covered (a name that matches nothing proves nothing): given a URL, use its hostname as the query; with only a name, find it first. Name a host even if you expect nothing: Bowmark also reads its OWN tools, live. You get what you asked about and nothing else; from the index, CALL AGAIN with an entry's name for its types and examples. Several parts? Pass queries: ["amazon", "youtube"], one per part, in ONE call.
Read the first lines of the answer. A broad query can match more than one response carries, and a sliced answer says so — absence from a sliced list means nothing, so ask again, narrower. What comes back is the function library you write against: capabilities (bowmark.flights.search(...)), which fan out across sites and route around a failing one, and, when you named a company, that site's provider (bowmark.providers.kayak.search(...)). Prefer the capability.
Loop: call get_library → write a JS script against the bowmark global → send it to run. The full reference is get_library({ query: "run guide" }).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional, but pass one — it decides how much detail comes back. What the user wants to do, in their words ("flights", "price a GPU", "book a table", "check stock"), or a company/site if they named one ("Kayak", "newegg.com"). If they supplied only a URL, pass its hostname rather than the full URL or its query parameters — and a HOSTNAME is worth passing even for a site you expect nothing to exist for, because that is what makes Bowmark look for the site's own tools. A rough guess is always safe: a value that matches nothing says so and what to try next rather than erroring, and omitting it returns the one-line index. | |
| queries | No | Optional. Several lookups in ONE call, one per part of the task: `["amazon", "youtube"]`, `["flights", "hotels in Lisbon"]`. Each entry is written exactly like `query` and answered exactly as `query` alone would be, in its own section. Use this instead of calling get_library once per part. At most 6; a `query` passed alongside is folded in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, and the description is consistent with all three ('One read-only call, no site is touched'). Beyond that it discloses real behavioral quirks the annotations cannot: a non-matching query says so rather than erroring, answers can be sliced (so absence from a sliced list means nothing), and the index vs. detail levels behave differently. That is exactly the added context the dimension rewards.
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?
Front-loaded with the primary trigger and organized with bold sub-headings, and the closing loop ('call get_library -> write a JS script -> send it to run') is a useful anchor. It is long for a two-parameter lookup and repeats the hostname guidance already present in the schema, so not every sentence strictly 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?
There is no output schema, so the description must explain returns — and it does: the function library with capabilities that fan out across sites, plus site-specific providers when a company was named, and the index/detail distinction. Combined with the error and slicing behavior, an agent has everything needed to call this correctly and interpret the answer.
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 100%, so the baseline is 3, but the description adds meaning beyond the schema: the hostname rule (only a hostname settles coverage; strip URL path/params) and the batching semantics for `queries` (one per part, max 6, `query` folded in). Some of this is duplicated verbatim in the schema descriptions, which caps the score.
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 concrete job — it 'answers whether Bowmark can already DO the thing' and returns 'the function library you write against' with named capabilities like `bowmark.flights.search(...)`. It also separates itself from siblings by naming the `run` tool and the get_library -> script -> run loop. The opening line, however, leads with usage ('Use this whenever a task touches a live website') rather than what the tool returns, so the actual purpose only surfaces in the fourth paragraph.
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?
Explicit when-to-use is given twice (live-website tasks, and questions about how to write/run a Bowmark script), plus an explicit narrowing condition — 'Behind a LOGIN is narrower' and it works only where a purpose-built provider or saved connection exists. It also justifies the call ('checking is cheap') and states the fallback ('you can use your normal approach'), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_secret_linkGet the user a link to one of their own stored loginsARead-onlyInspect
Return the dashboard link for one stored secret this account holds, so you can answer "where is my Acme password?" with somewhere to go. It returns a URL, never a value — opening it requires the user to be signed in and to confirm who they are, and only their own browser can read what comes back.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The stored secret's name, as `list_secrets` shows it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, and the description adds meaningful behavioral detail: it returns only a URL, opening it requires the user to be signed in and confirm identity, and only the user's own browser can read the resolved value. This is security-relevant context beyond what readOnlyHint provides.
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 filler. The first sentence states the function and a concrete use case; the second adds the critical return-type and security behavior. Every 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?
For a one-parameter, read-only tool with strong annotations, the description fully covers what the tool returns, the authentication requirement, and the user-specific access model. Since there is no output schema, the explicit statement that it returns a URL is valuable and sufficient for an agent to invoke and interpret the result.
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 100%, so the single `name` parameter is already documented as the secret's name as shown by list_secrets. The description adds only a mild constraint ('one stored secret this account holds') but no new format or validation detail, which matches the baseline of 3 for high schema 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?
The description states a specific verb and resource: return the dashboard link for one stored secret. It also distinguishes itself from value-returning siblings by explicitly promising 'a URL, never a value,' so an agent can tell it apart from tools like request_secret or list_secrets.
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 clear context: use this when the user wants a navigable link to one of their stored secrets, such as answering 'where is my Acme password?' with somewhere to go. It does not explicitly name alternatives or say 'not when the secret value itself is needed,' so it stops short of a 5, but the URL-versus-value contrast provides strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lease_ipGet the user a dedicated IP for sites that need oneAInspect
Some sites (LinkedIn, marked 📍 in get_library) only accept a login from the address it signed in from. A dedicated IP is one address that only this account uses, and once the account holds one, every sign-in link and every later call on that login uses it automatically.
Call with no arguments first. If the account already holds one, it says so and nothing is bought. Otherwise it returns priceCents and a message with the price for termDays days in country (default US). The price is charged up front and is not refundable. If something must happen first (a card on file, a one-time identity check), mustFirst names it with the link that fixes it: give your user that link and stop.
Never buy without asking. Tell your user the exact price and buy only if they agree, by calling again with confirmPriceCents set to the price they agreed to. A live price above that is refused before any charge, and repeating the same call cannot buy two. Pass another: true only when your user asked for a second IP.
| Name | Required | Description | Default |
|---|---|---|---|
| another | No | Buy a second IP although the account holds one. Only when your user asked. | |
| country | No | Two-letter country code for the IP, e.g. "US" (the default). | |
| termDays | No | How many days the IP is held, paid up front (default 30). | |
| confirmPriceCents | No | The price in US cents your user agreed to, from the unconfirmed call. Only this buys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, destructive=false, idempotent=false): the price is charged up front and is non-refundable, a live price above the agreed amount is refused before any charge, and repeating the same call cannot buy twice. This is exactly the money-and-side-effect context an agent needs and that the schema/annotations do not carry.
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?
Front-loads the no-argument first call, then the pricing/confirmation contract, with the critical 'Never buy without asking' bolded. It is long, but for a tool that spends money every sentence is load-bearing; only the introductory explanation of what a dedicated IP is could be trimmed.
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 still names the return fields (`priceCents`, `message`, `mustFirst`) and the full confirm-before-charge loop, including the prerequisite path. Nothing an agent needs to call this safely is missing.
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 baseline is 3, but the description adds real workflow meaning: `confirmPriceCents` is the agreed price from the unconfirmed call and is the only thing that buys, `another` is only for a user-requested second IP, and `country`/`termDays` defaults (US, 30) are restated in context of the pricing flow.
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 action (lease/buy a dedicated IP) and explains exactly why it exists: sites like LinkedIn that only accept a login from the original address. It routes to the sibling `get_library` for locating such sites, so an agent can distinguish this from the other connection/secret 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?
Explicit sequencing: 'Call with no arguments first', stop and hand the user the `mustFirst` link if a prerequisite exists, and only buy after telling the user the exact price. It also scopes `another: true` to 'only when your user asked for a second IP' — clear when-to-use and when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_connectionsSee which sites Bowmark is already signed in toARead-onlyInspect
List the saved logins this account already holds, one entry per login: its id (name it in a signed-in call as { connection: id }), the site, which account on that site, whether it works right now (usable), and when it was made, last used and last checked.
Call this before any task that needs a login, and again whenever you come back to one later. A usable login means the site is already signed in: do not ask the user to sign in, just run the script, naming the id if the site has more than one. Prefer the login you used before over a new one.
A login marked needs_reauth, expired or logged_out is not lost. Run the script anyway (name the id if you know it): it pauses with a link, and signing in through that link puts the fresh session back into the SAME id, so you can keep using it. To add a login for a site with none, call add_connection — it hands you a sign-in link for the user. delete_connection only asks the user to delete one this account already holds.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnly/non-destructive/closed-world), and the description adds substantial behavior beyond that: the exact entry shape, the `{ connection: id }` naming convention, and critically the semantics of unusable logins — that needs_reauth/expired/logged_out sessions are not lost, that a run pauses with a link, and that re-auth restores the same id. This is context an agent cannot derive from annotations or the empty schema.
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?
Front-loaded with what is listed, then the usage directive in bold, then the recovery semantics. It is longer than typical, but nearly every sentence carries actionable instruction (id naming, re-auth behavior, sibling routing) rather than filler.
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 compensates by enumerating the returned fields and explaining how each is meant to be used, and it covers the full lifecycle an agent will hit (usable vs. needs_reauth/expired/logged_out). Nothing needed to call it or interpret its result is missing.
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 is 4. The description's field enumeration ('id', site, account, usable, timestamps) describes return values rather than inputs, which is still useful but not strictly parameter semantics.
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+resource ('List the saved logins this account already holds, one entry per login') and enumerates the returned fields, so an agent knows exactly what it gets. It is clearly distinguished from the sibling writers (add_connection, delete_connection) by naming their roles explicitly.
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 direct when-to-use guidance ('Call this before any task that needs a login, and again whenever you come back to one later') plus an exclusion ('do not ask the user to sign in, just run the script') and a preference rule ('Prefer the login you used before over a new one'). It also routes to the two alternatives, add_connection and delete_connection, with the condition that selects each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_secretsSee which of the user's logins Bowmark already holdsARead-onlyInspect
List the stored secrets this account holds, by NAME. Returns name, type, which hosts each may be used against, when it expires and when it was last used — never a value, and no Bowmark endpoint returns one.
Call this BEFORE request_secret. A secret the user has already set is ready to use; asking for it again sends them to a page for nothing. In a script, refer to one by name: bowmark.secret('acme_pw').
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds the critical behavioral trait that no value is ever returned and no endpoint returns one, which is essential for an agent to avoid expecting secrets. It also specifies exactly what fields are returned. This adds significant transparency beyond annotations.
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 short paragraphs. The first sentence states the purpose and returns, the second adds usage guidance. Every sentence is informative with no redundancy. It is front-loaded with the core action and constraint.
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 list tool with no parameters, the description is complete. It describes the output fields, the constraint on never returning values, and usage guidance with an example. No output schema exists, so the description carries the burden, which it does effectively.
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 the schema already covers all parameters (none). The description adds no parameter details because none exist. Baseline 4 is appropriate for a parameterless 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 clearly states 'List the stored secrets this account holds, by NAME' and enumerates the returned fields, explicitly noting it never returns a value. It also differentiates from sibling request_secret by ordering. This is a specific verb+resource that distinguishes 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 description explicitly instructs 'Call this BEFORE request_secret' and explains the rationale (avoiding sending user to a page for nothing). It also gives script usage example. This clearly guides when to use this tool versus the key alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logout_connectionSign one of the user's saved logins outADestructiveIdempotentInspect
Sign a saved login out by the id list_connections returned. Bowmark drops the cookies it held, and where the site supports it (siteLogout: "supported" in the reply) the session is ended ON THE SITE too — siteSignedOut: true means Bowmark checked the site no longer accepts it. The saved login is KEPT, status logged_out, so the user can sign back in to the same entry later.
Call this when the user asks to sign out of a site. delete_connection is the other action: it hands the user a link to forget the entry entirely, which leaves the site session alive.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The connection `id` from `list_connections`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it explains what actually gets dropped (cookies), that the site session may be terminated when supported, and that the saved login itself is KEPT with status `logged_out`. It also interprets response fields (`siteLogout`, `siteSignedOut`) despite there being no output schema, clarifying exactly what is destroyed versus preserved.
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?
Front-loaded with the core action and side effects, then the routing rule. Dense and largely waste-free, though a few clauses (e.g., the parenthetical about `siteLogout: "supported"`) could be tightened without losing meaning.
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 single-parameter tool with no output schema, the description covers the trigger, the side effects, the alternative tool, the retained state, and the meaning of return values. Nothing an agent needs in order to call it correctly is missing.
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 100% and the single `id` parameter is already documented as coming from `list_connections`. The description restates that provenance but adds no format or syntax detail beyond the schema, so the baseline of 3 applies.
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 ('Sign a saved login out') and explicitly scopes it by the id returned from `list_connections`. It also pre-emptively differentiates itself from `delete_connection` by naming that sibling and contrasting their effects.
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 an explicit trigger ('Call this when the user asks to sign out of a site') and names the alternative action plus its consequence ('delete_connection ... leaves the site session alive'), so the routing decision is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reportReport what Bowmark could not do for this taskAInspect
Record what was missing, wrong, or incomplete so Bowmark can build it. Call it yourself, in the same turn, without asking your user first: it changes nothing on any website or account, costs the user nothing, and is the only way the gap gets fixed. Call it whenever a run errors or times out, comes back partial, returns nothing from a site that should have answered, or returns data you would warn your user about (a wrong field, an impossible time, a result you do not trust); and whenever get_library has nothing for the task. Pass the runId returned by run when this report is about a run; omit it when get_library did not cover the task. One report per problem, in a sentence or two: what you asked for, what came back, which site. This records feedback only and does not retry a run. For an account holder the result may also carry supportRoom, a live chat with Bowmark support about this report: follow the instructions that come with it. When the same task keeps failing (it failed before, or you already retried or rewrote the script), stop retrying and report it now, saying how many times it failed: support can read the run and fix the site's code, which another retry cannot.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | No | Optional `runId` returned by `run` for the result you are reporting. | |
| report | Yes | What Bowmark could not do or returned incorrectly. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| supportRoom | No | A live Bowmark support chat about this report, for account holders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only give generic readOnly/destructive/idempotent/openWorld flags) by stating the tool changes nothing on any website or account, costs the user nothing, records feedback only and never retries, and may return a 'supportRoom' live-chat channel with follow-up instructions. It also tells the agent to act without asking the user first, which is material for autonomous invocation.
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?
Front-loaded with purpose and the call-it-yourself instruction, then trigger conditions, then parameter guidance and escalation. Every sentence carries operational content, though the run is long for a two-parameter tool and the safety reassurance ('changes nothing, costs nothing') is stated more expansively than strictly needed.
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?
An output schema exists, so return values need no explanation, yet the description still flags the notable 'supportRoom' field and how to act on it. Combined with trigger conditions, parameter routing, and the no-retry contract, nothing an agent needs to invoke this correctly is missing.
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 both parameters are already documented and baseline would be 3. The description adds real semantics on top: pass 'runId' when reporting a run, omit it when the report concerns a 'get_library' miss, and shape the 'report' body as one problem per submission covering what was asked, what came back, and which site.
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 ('Record what was missing, wrong, or incomplete') and immediately frames it against the siblings it depends on ('run' errors, 'get_library' gaps). An agent can tell this apart from 'run' or 'get_library' without opening 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?
Enumerates explicit trigger conditions (run errors, timeouts, 'partial', empty results from a site that should answer, untrusted data, get_library misses) and an explicit escalation rule ('when the same task keeps failing... stop retrying and report it now'). It also states what this tool is not (it does not retry a run) and why it beats the alternative (support can read the run and fix the site's code, which another retry cannot).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_secretAsk the user to set a login Bowmark will needAIdempotentInspect
Create a named, empty slot for a secret and get back a link the user opens to fill it in. They type the value on a Bowmark page and choose how long it lives, from 5 minutes to never. It is encrypted in their own browser before it leaves, so nothing on the way — this connection included — ever sees it.
Give the user the link. Never ask them to type a password, API key or one-time code to you. A secret in this conversation is in your context, in the transcript and in the logs.
Name it for the person, not for your script. The name you pass is the heading on the page they open and the row they see in their secret list months later, so make it <site>_<what it is>: letterboxd_password, stripe_api_key, acme_totp_seed. A run id, a timestamp, a uuid or a bare password is refused.
Call list_secrets first: if the name already exists and is set, use it instead. name is lowercase letters, digits, _, . and -. hosts narrows where the value may be used and is worth passing — a secret is refused against any other site.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Lowercase name, `<site>_<what it is>` — `letterboxd_password`, `stripe_api_key`, `acme_totp_seed`. Letters, digits, _ . - only. THE USER READS THIS: it is the heading on the page they open and the row in their credential list months later, so use words, never a run id, a timestamp or a bare `password`. | |
| type | Yes | What kind of value the person will be asked for. | |
| hosts | No | Hosts the value may be used against, e.g. ["acme.com"]. Refused elsewhere. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses crucial behaviors beyond annotations: browser-side encryption, transcript/log exposure, refusal of non-human-readable names, and host-slot enforcement. None of these are visible in the schema or annotations.
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?
Front-loads the core mechanism, then uses bold directives for the two most safety-critical instructions. Despite length, every sentence earns its place by adding security, naming, or usage guidance.
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?
Provides outcome (a link), user journey, lifetime range, preconditions, validation rules, and failure behavior. No output schema exists, but the return value is described sufficiently for 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 already covers all three parameters, so the baseline is 3. The description adds meaning for name (user-facing heading, months-later list row, naming refusals) and hosts (worth passing, refused elsewhere), though type semantics remain only in 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?
States a specific action: create a named empty secret slot and return a user-facing fill-in link. This clearly distinguishes it from lookup/listing siblings like list_secrets and get_secret_link.
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 explicit preconditions: call list_secrets first and reuse an existing set secret, and instructs the agent to hand the link to the user rather than collect the secret. It does not explicitly compare with get_secret_link, so it loses a point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runDo the task on the live websites and return the resultADestructiveInspect
Executes the task on the real websites and returns the result. Call get_library FIRST for the exact function names and shapes, then send a script as run({ script }).
THE SCRIPT is a plain async JavaScript body, not a wrapping function. bowmark is a ready global: await bowmark.<capability>.<fn>(...), or one site via await bowmark.providers.<provider>.<fn>(...). return what you want back; log(...) for progress. Built-ins plus URL/URLSearchParams exist; fetch, import, setTimeout and a filesystem do not — bowmark is the only I/O.
MIND THE CLOCK. Your client times a tool call out at around 55 seconds, and one capability call already spends 30-55 seconds, so default to ONE per script. Need several? Run them together in Promise.allSettled (a dropped leg still comes back as partial), never one after another, and never await inside a for loop. Keep the result under ~25,000 characters.
CHECK status BEFORE ok — ok | error | partial | needs_user | running:
• running: it is still going. Call run({ runId }) to wait for the SAME run; never resend the script.
• partial: result is real but narrower than asked; incomplete names what did not answer. Tell your user — never call it complete. incomplete.failures[].fixable: true means your argument was wrong: fix it and rerun.
• needs_user: a site needs your user signed in; not a failure. Give them meta.handoff.url, name the sites, then call wait_for_sign_in with meta.handoff.ref. On done, send the SAME script unchanged.
• error: there is no result; error says why.
Saving files, one exit IP, saved secrets, warnings, emptyHanded, and the billed browser_agent/delegate fallbacks: get_library({ query: "run guide" }).
| Name | Required | Description | Default |
|---|---|---|---|
| runId | No | Only to collect a run an earlier call answered `status: "running"` for: pass its `runId` and no `script`, and this call waits for that same run's result. | |
| script | No | The JavaScript script body to execute (async, against the `bowmark` global). e.g. `const { flights, warnings } = await bowmark.flights.search({from:'SFO',to:'JFK',depart:'2026-09-01'}); return { best: flights.sort((a,b)=>a.price-b.price)[0], warnings };` |
Output Schema
| Name | Required | Description |
|---|---|---|
| ms | No | |
| ok | Yes | |
| logs | No | |
| meta | No | |
| error | No | |
| needs | No | |
| notes | No | |
| runId | No | |
| notice | No | |
| result | No | |
| status | No | |
| queuedMs | No | |
| incomplete | No | |
| savedFiles | No | |
| emptyHanded | No | |
| secretNeeds | No | |
| savedSecrets | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag openWorld/destructive/non-idempotent, and the description adds substantial context the annotations cannot: the ~55s client timeout versus 30-55s per capability call, the ~25,000 character result budget, `partial` meaning real-but-narrower results with `incomplete.failures[].fixable`, `needs_user` as a non-failure handoff, and `error` carrying no result. It also warns never to resend the script while `running`.
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?
It is long, but tightly organized with bold headers, a bulleted status list, and the core action front-loaded; the final line defers files/secrets/billing to `get_library` rather than bloating further. The only cost is sheer density, which is warranted for a script-execution tool but still heavier than ideal.
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?
Despite arbitrary-code execution and an output schema, the description covers everything an agent needs to invoke and react correctly: script format, runId reuse, timeout math, result-size limits, the full status taxonomy, and the sign-in handoff path. Return-value explanation is rightly omitted because an output schema exists.
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 goes well beyond the schema by defining the `script` parameter's contract: a plain async body rather than a wrapping function, the available globals (`URL`/`URLSearchParams`), the absent ones (`fetch`, `import`, `setTimeout`, filesystem), and the `return`/`log` conventions. That is genuine semantic value the schema alone does not convey.
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 names a specific action (execute a JS script body against the `bowmark` global on live websites) and the resource (real, open-world sites), and it explicitly positions itself relative to siblings by telling the agent to call `get_library` first and to use `wait_for_sign_in` for the handoff flow. An agent can tell what this tool is and where it sits in the workflow without opening any 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?
It states when to use the tool (`get_library` FIRST for function names, then `run({ script })`), when to reuse a runId versus resending a script, and how to branch on each `status` value (`running`/`partial`/`needs_user`/`error`). It also gives concrete sequencing guidance (one capability per script, `Promise.allSettled` instead of sequential awaits) and routes extended topics to `get_library({ query: "run guide" })`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_viewRun viewARead-onlyInspect
Used by the inline run view to draw a run's progress. You do not need to call this — run returns the result.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | No | ||
| script | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint=false, and destructiveHint=false. The description adds integration context (internal inline run view) and a clear directive that agents should not invoke it, which is valuable beyond the structured annotations.
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, front-loaded with the integration purpose and then the routing instruction. No filler.
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 an internal UI-support tool, the description adequately explains what it is and why an agent should not call it, and it notes `run` returns the result. It leaves parameter behavior unexplained, but the no-call guidance reduces the practical gap.
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% and the description does not mention either parameter (`runId` or `script`). It provides no meaning, format, or usage for the parameters beyond the schema's bare types.
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 resource (a run's progress) and the context (inline run view), and explicitly distinguishes itself from the `run` sibling by saying `run` returns the result. However, the verb 'draw' is unusual and the tool's actual return or behavior is not operationally clear.
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?
Explicitly tells the agent not to call this tool and names the alternative (`run`) that provides the result. This is a clear when-not-to-use rule with an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_sign_inWait for the user to finish signing inARead-onlyInspect
Wait until the user finishes a sign-in link, so you know the moment they are done without asking them. Pass ref: meta.handoff.ref from a paused run, or ref from add_connection.
Call it right after you give the user the link, in the same turn. Write the link in your reply first, so they can see it while this waits. It holds for up to waitMs (default 45000, at most 50000) and answers the moment the sign-in finishes.
It returns state:
• done: every site on the link is signed in. Send the SAME script again now (or carry on with the task after add_connection). Do not ask the user whether they are done.
• pending: not yet; remaining names the sites still missing. Call it again with the same ref. Keep going while the link is live (expiresAt, 15 minutes); a person often takes a few minutes.
• cancelled: the user pressed Cancel. Tell them, and do not re-send the script unless they ask.
• expired: the link ran out first. Send the SAME script again; it pauses with a fresh link.
• unknown: no link with that ref on this account. A ref starting site: cannot be watched: wait for the user instead.
If the user replies while you are waiting, answer them; the link is still live and you can wait again.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | `meta.handoff.ref` from a paused run, or `ref` from `add_connection`. | |
| waitMs | No | How long to wait for the sign-in to finish, in ms. Default 45000, at most 50000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish this is a safe read (readOnlyHint=true, destructiveHint=false), and the description goes well beyond that: it discloses the blocking duration and cap, the full state machine returned (done/pending/cancelled/expired/unknown), the 15-minute link lifetime via expiresAt, and the prescribed agent action for each state. This is exactly the behavioral context annotations alone cannot convey.
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 core action and the 'call it right after' instruction are front-loaded, and the per-state bullets are scannable. It is slightly verbose, repeating 'Send the SAME script again' across two states, but nearly every sentence carries actionable guidance.
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 fully carries the return-value burden by enumerating each state and the required follow-up. Combined with the timing and expiry details, an agent has everything needed to call this correctly and react to any outcome.
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 100%, so both parameters are already documented in the schema, and the description largely restates the same ref source and the same waitMs default/maximum. It does not add syntax or format detail beyond the schema, so the baseline 3 applies.
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+resource (wait until the user finishes a sign-in link) and frames the scope precisely: it watches a live sign-in rather than driving it. It is clearly distinguished from siblings like add_connection (which issues the link) and run/run_view.
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?
Explicit when-to-use: 'Call it right after you give the user the link, in the same turn', with the prerequisite that the link be written first. It also states when it cannot be used (a ref starting 'site:' cannot be watched; wait for the user instead) and tells the agent not to ask the user whether they are done.
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
- Changed
get_library1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Optional, but pass one — it decides how much detail comes back. What the user wants to do, in their words (\"flights\", \"price a GPU\", \"book a table\", \"check stock\"), or a company/site if they named one (\"Kayak\", \"newegg.com\"). If they supplied only a URL, pass its hostname rather than the full URL or its query parameters — and a HOSTNAME is worth passing even for a site you expect nothing to exist for, because that is what makes Bowmark look for the site's own tools. A rough guess is always safe: a value that matches nothing returns the one-line index rather than an error, and so does omitting it."New value: +"Optional, but pass one — it decides how much detail comes back. What the user wants to do, in their words (\"flights\", \"price a GPU\", \"book a table\", \"check stock\"), or a company/site if they named one (\"Kayak\", \"newegg.com\"). If they supplied only a URL, pass its hostname rather than the full URL or its query parameters — and a HOSTNAME is worth passing even for a site you expect nothing to exist for, because that is what makes Bowmark look for the site's own tools. A rough guess is always safe: a value that matches nothing says so and what to try next rather than erroring, and omitting it returns the one-line index."
Related MCP Connectors
use any website on a user's behalf in a cloud browser: navigate, sign in, fill forms, buy, download.
- PomeradoOAuthai.pomerado
MCPs that do tasks on any website. Search flights, book, shop, check accounts and fill in forms.
Let your AI agent operate any website through a real, logged-in browser session.
Read, crawl and act on websites, signed in as the user, and turn any site into an API.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI agents to open, read, and act on live web pages through verified browser actions, including filling forms, extracting data, debugging pages, and handling bot walls.102MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to browse websites, extract information, fill forms, interact with pages, and execute multi-step web tasks autonomously.-
- AlicenseBqualityAmaintenanceGives agents an autonomous browser that takes a single goal-level call and drives a real Chrome step by step, returning a verified result or a concrete question instead of guessing. It keeps passwords out of prompts, requires approval before buy/pay/delete actions, and detects login walls and bot challenges.962 npm2MIT

Cloak Agentofficial
AlicenseAqualityBmaintenanceEnables an agent to run whole browser tasks on live web pages from a plain-language goal — opening tabs, clicking, typing, scrolling, and returning the relevant page sections as markdown — with every step reported alongside its confidence. Tabs can be reused and closed across calls, so multi-step flows continue on the page the previous task ended on.23MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.