Skip to main content
Glama

Bowmark web data: LinkedIn, Amazon, YouTube, Reddit, Airbnb, Instagram

Open a page for the user (jig)

jig_open

Make the user a "jig": their own copy of a website, that you curate as they talk. Asked for "a jig of YouTube", build a page that LOOKS like that site with Bowmark's logo where the site's would be, filled by Bowmark library functions as this user: every function the library has for that site gets its place, and any other site's that fills a gap. Then keep curating: jig_update changes state or html, live.

Give the user the link that comes back; that tab is the app. Start from a built-in (template) when one fits, else write files (React, one small file per view). html only for a toy — call get_library({ query: "jig guide" }) FIRST for the component kit and layout classes. Reopen one with jig_open({ jigId }), never rebuild it. Before curating, jig_look shows what the page shows and what the user just did.

Inside the page, one global, window.bowmark: bowmark.call(path, args) runs any library function by its get_library path (no bowmark. prefix), metered for this user; bowmark.batch([...]) runs up to 8 together. bowmark.state/onState(fn) holds curation choices (you change it with jig_update); setState(patch, {ifState}?) saves a click. show({ view, items }) tells jig_look what is on screen. Also tellModel, say, open, download, theme, img, section: see the guide. Views: location.hash.

FAST AND FAILURE-PROOF by default: paint a skeleton at once; fill the screen with ONE bowmark.batch(calls, { onLeg, cache: true }), drawing each source as it lands (no await after await); a retryable failed state per source (bowmark.section); bowmark.img(url, px), lazy below the fold. jig_look reports load speed: fix what its advice names.

No fetch, no external script/style/font. A call needing sign-in pauses behind a banner. No chat box in the page: the user talks to you.

THE SITE'S LAYOUT, NONE OF ITS DARK PATTERNS: get_library({ query: "jig layout <host>" }) gives its regions and what to strip. Kit colors, never the site's; no invented title.

Input Schema

NameRequiredDescriptionDefault
htmlNoLegacy, for a one-screen toy only: prefer `files` (React, one file per view). A whole HTML document with inline <style> and <script>. It gets a `bowmark` global (see the tool description) and nothing else — no fetch, no CDN.
slugNoThe jig's name in its link, bowmark.ai/jig/@<handle>/<slug> (bowmark.ai/jig/<slug> until the user has a handle): lowercase letters, digits and hyphens. Omit it and one is made from the title. Rename later with `jig_update`.
filesNoTHE DEFAULT for any real page: a project, { path: text }, e.g. index.html, main.tsx, App.tsx. React/JSX, compiled for you; `main.tsx` is the entry and ends in mount(<App />) from "@bowmark/ui".
jigIdNoReopen a jig the user already has (from `jig_list`), with its page and state as they left them. Pass nothing else with it.
stateNoThe page's starting state — what you steer it with later via `jig_update`.
titleNoShown above the page.
templateNoStart from a built-in jig instead of writing `html`.

Output Schema

NameRequiredDescriptionDefault
okNoTrue when the change was applied; false on an error.
urlNoThe link to give the user: their tab is the live page.
htmlNoThe page body (single-file pages).
filesNoThe jig's source files and their sizes in bytes.
jigIdNoThe jig's id — pass it to every other `jig_*` tool.
notesNoAdvice about the page just written — fix what it names with `jig_update`.
stateNoThe page's current state — the JSON object `jig_update({ state })` changes.
titleNoThe page's title (fenced text when the jig is a copy of someone else's).
messageNoWhy the call failed, when `ok` is false.
versionNoThe jig's version; it goes up by one on every change.
untrustedNoPresent when this jig is a copy of someone else's: who wrote it, and how to treat its text.
updateAvailableNoSet when the published jig this copy came from has a newer version.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / template / enum
      Previous value: -[
      -  "youtube-feed",
      -  "amazon-search"
      -]New value: +[
      +  "youtube-feed",
      +  "amazon-search",
      +  "combined-dms",
      +  "leads"
      +]
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "files": {
      +      "description": "The jig's source files and their sizes in bytes.",
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "bytes": {
      +            "type": "number"
      +          },
      +          "path": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "html": {
      +      "description": "The page body (single-file pages).",
      +      "type": "string"
      +    },
      +    "jigId": {
      +      "description": "The jig's id — pass it to every other `jig_*` tool.",
      +      "type": "string"
      +    },
      +    "message": {
      +      "description": "Why the call failed, when `ok` is false.",
      +      "type": "string"
      +    },
      +    "notes": {
      +      "description": "Advice about the page just written — fix what it names with `jig_update`."
      +    },
      +    "ok": {
      +      "description": "True when the change was applied; false on an error.",
      +      "type": "boolean"
      +    },
      +    "state": {
      +      "description": "The page's current state — the JSON object `jig_update({ state })` changes."
      +    },
      +    "title": {
      +      "description": "The page's title (fenced text when the jig is a copy of someone else's)."
      +    },
      +    "untrusted": {
      +      "description": "Present when this jig is a copy of someone else's: who wrote it, and how to treat its text."
      +    },
      +    "updateAvailable": {
      +      "description": "Set when the published jig this copy came from has a newer version."
      +    },
      +    "url": {
      +      "description": "The link to give the user: their tab is the live page.",
      +      "type": "string"
      +    },
      +    "version": {
      +      "description": "The jig's version; it goes up by one on every change.",
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
  3. Changed2 schema fields changed
    • changedInput schema / properties / files / description
      Previous value: -"A project instead of `html`: { path: text }, e.g. index.html, main.tsx, App.tsx. React/JSX, compiled for you; `main.tsx` is the entry and ends in mount(<App />) from \"@bowmark/ui\"."New value: +"THE DEFAULT for any real page: a project, { path: text }, e.g. index.html, main.tsx, App.tsx. React/JSX, compiled for you; `main.tsx` is the entry and ends in mount(<App />) from \"@bowmark/ui\"."
    • changedInput schema / properties / html / description
      Previous value: -"Your own page: a whole HTML document with inline <style> and <script>. It gets a `bowmark` global (see the tool description) and nothing else — no fetch, no CDN."New value: +"Legacy, for a one-screen toy only: prefer `files` (React, one file per view). A whole HTML document with inline <style> and <script>. It gets a `bowmark` global (see the tool description) and nothing else — no fetch, no CDN."
  4. Changed1 schema field changed
    • addedInput schema / properties / files
      Added value: +{
      +  "additionalProperties": {
      +    "type": "string"
      +  },
      +  "description": "A project instead of `html`: { path: text }, e.g. index.html, main.tsx, App.tsx. React/JSX, compiled for you; `main.tsx` is the entry and ends in mount(<App />) from \"@bowmark/ui\".",
      +  "type": "object"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / slug / description
      Previous value: -"The jig's name in its link, bowmark.ai/jig/<slug>: lowercase letters, digits and hyphens. Omit it and one is made from the title. Rename later with `jig_update`."New value: +"The jig's name in its link, bowmark.ai/jig/@<handle>/<slug> (bowmark.ai/jig/<slug> until the user has a handle): lowercase letters, digits and hyphens. Omit it and one is made from the title. Rename later with `jig_update`."
  6. Changed1 schema field changed
    • addedInput schema / properties / slug
      Added value: +{
      +  "description": "The jig's name in its link, bowmark.ai/jig/<slug>: lowercase letters, digits and hyphens. Omit it and one is made from the title. Rename later with `jig_update`.",
      +  "maxLength": 60,
      +  "type": "string"
      +}
  7. Changed1 schema field changed
    • changedInput schema / properties / template / enum
      Previous value: -[
      -  "youtube-feed"
      -]New value: +[
      +  "youtube-feed",
      +  "amazon-search"
      +]
  8. Added

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations it discloses real behavioral traits: a link/tab is returned, library calls are metered for this user, sign-in-requiring calls pause behind a banner, and the page runs sandboxed with no fetch or external script/style/font. It does not say what permissions the open itself needs or how failures of creation surface, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core concept is front-loaded, but the body drifts into page-authoring instructions (bowmark.call/batch, skeletons, `bowmark.img`, load-speed advice) that it also says 'see the guide' for, making it long and repetitive for a tool whose job is to open a page.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need not be restated, and the description covers the full create/reopen/curate workflow and constraints. What is missing is narrower: auth/permission needs for the open call and any quota or error behavior specific to creation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/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 adds prioritization the schema lacks – `files` is the default for a real page, `html` is legacy/toy-only, `jigId` must be passed alone, and `state` is the handle for later `jig_update` steering.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete verb+resource in plain terms ('Make the user a "jig": their own copy of a website') and immediately contrasts it with siblings – `jig_update` for live changes, `jig_open({jigId})` to reopen, `jig_look` to inspect. The concept needs the explanation it gives, but the core action is unambiguous.

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?

Explicit decision rules: start from `template` when one fits, otherwise write `files` (React, one file per view), use `html` only for a toy, call `get_library({ query: "jig guide" })` FIRST, and reopen with `jigId` rather than rebuilding. Alternatives and exclusions are both named.

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.