Skip to main content
Glama

Do the task on the live websites and return the result

run
Destructive

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" }).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
runIdNoOnly 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.
scriptNoThe 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

TableJSON Schema
NameRequiredDescriptionDefault
msNo
okYes
logsNo
metaNo
errorNo
needsNo
notesNo
runIdNo
noticeNo
resultNo
statusNo
queuedMsNo
incompleteNo
savedFilesNo
emptyHandedNo
secretNeedsNo
savedSecretsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / notes
      Added value: +{}
  2. Changed1 schema field changed
    • addedOutput schema / properties / queuedMs
      Added value: +{
      +  "type": "number"
      +}
  3. Changed3 schema fields changed
    • addedInput schema / properties / runId
      Added value: +{
      +  "description": "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.",
      +  "format": "uuid",
      +  "type": "string"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "script"
      -]
    • changedOutput schema / properties / status / enum
      Previous value: -[
      -  "ok",
      -  "error",
      -  "partial",
      -  "needs_user"
      -]New value: +[
      +  "ok",
      +  "error",
      +  "partial",
      +  "needs_user",
      +  "running"
      +]
  4. Changed1 schema field changed
    • addedOutput schema / properties / savedFiles
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "bytes": {
      +        "type": "number"
      +      },
      +      "contentType": {
      +        "type": "string"
      +      },
      +      "expiresAt": {
      +        "type": "string"
      +      },
      +      "id": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "name",
      +      "contentType",
      +      "bytes",
      +      "url",
      +      "expiresAt"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  5. Changed1 schema field changed
    • removedOutput schema / properties / cost
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "lines": {
      -      "items": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "quantity": {
      -            "type": "number"
      -          },
      -          "sku": {
      -            "type": "string"
      -          },
      -          "unit": {
      -            "enum": [
      -              "bytes",
      -              "ms",
      -              "count"
      -            ],
      -            "type": "string"
      -          },
      -          "usd": {
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "sku",
      -          "quantity",
      -          "unit",
      -          "usd"
      -        ],
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "usd": {
      -      "type": "number"
      -    }
      -  },
      -  "required": [
      -    "usd",
      -    "lines"
      -  ],
      -  "type": "object"
      -}
  6. Changed2 schema fields changed
    • addedOutput schema / properties / savedSecrets
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "name": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "type": "string"
      +      },
      +      "viewUrl": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "type",
      +      "viewUrl"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / secretNeeds
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "expiredAt": {
      +        "type": "string"
      +      },
      +      "reason": {
      +        "enum": [
      +          "expired",
      +          "pending",
      +          "unavailable"
      +        ],
      +        "type": "string"
      +      },
      +      "secret": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "secret",
      +      "reason"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  7. Changed1 schema field changed
    • addedOutput schema / properties / cost
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "lines": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "quantity": {
      +            "type": "number"
      +          },
      +          "sku": {
      +            "type": "string"
      +          },
      +          "unit": {
      +            "enum": [
      +              "bytes",
      +              "ms",
      +              "count"
      +            ],
      +            "type": "string"
      +          },
      +          "usd": {
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "sku",
      +          "quantity",
      +          "unit",
      +          "usd"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "usd": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "usd",
      +    "lines"
      +  ],
      +  "type": "object"
      +}
  8. Changed1 schema field changed
    • addedOutput schema / properties / notice
      Added value: +{}
  9. Changed1 schema field changed
    • addedOutput schema / properties / emptyHanded
      Added value: +{}
  10. Changed1 schema field changed
    • addedOutput schema / properties / runId
      Added value: +{
      +  "format": "uuid",
      +  "type": "string"
      +}
  11. Changed2 schema fields changed
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • removedOutput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
  12. Changed2 schema fields changed
    • addedOutput schema / properties / incomplete
      Added value: +{}
    • changedOutput schema / properties / status / enum
      Previous value: -[
      -  "ok",
      -  "error",
      -  "needs_user"
      -]New value: +[
      +  "ok",
      +  "error",
      +  "partial",
      +  "needs_user"
      +]
  13. Changed1 schema field changed
    • changedInput schema / properties / script / description
      Previous value: -"The JavaScript script body to execute (async, against the `bowmark` global). e.g. `const f = await bowmark.flights.search({from:'SFO',to:'JFK',depart:'2026-09-01'}); return f.sort((a,b)=>a.price-b.price)[0];`"New value: +"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 };`"
  14. Added

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.