Skip to main content
Glama

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

Steer an open page (jig)

jig_update
Idempotent

Change a page you opened with jig_open: merge state into its state (a key set to null is removed), replace its html or title, or change part of the html with edits ([{ find, replace }], each find exactly once) instead of resending the whole page. On a project, files writes files ({ path: text }, null deletes one) and an edit's path picks its file. The open page updates itself within a few seconds — do not call jig_open again. Use this whenever the user asks, in chat, for the page to show something different.

Input Schema

NameRequiredDescriptionDefault
htmlNoReplace the whole page body (a single-file page).
slugNoRename the jig's link, the <slug> in bowmark.ai/jig/@<handle>/<slug>. The old link keeps working and redirects.
editsNoFind/replace on a file (default index.html), applied in order.
filesNoWrite files of a project: { path: text }; a path set to null deletes it.
jigIdYesThe jig's id, as `jig_open` or `jig_list` returned it.
resetNoReset jig: true sends nothing else. State goes back to the page's default and every stored row is deleted. The html and link stay. Only when the user asks.
stateNoKeys to change in the page's state, merged into what is there.
titleNoA new title for the page.
mergedFromNoAfter merging an update from `jig_pull_update`: the `theirsVersion` you merged. Send it with the merged `html` (or `edits`); the copy is then based on that version, and any new functions it calls wait for the user's approval.
replaceStateNoStart from {} instead of merging.

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. Changed5 schema fields changed
    • addedInput schema / properties / html / description
      Added value: +"Replace the whole page body (a single-file page)."
    • addedInput schema / properties / jigId / description
      Added value: +"The jig's id, as `jig_open` or `jig_list` returned it."
    • addedInput schema / properties / state / description
      Added value: +"Keys to change in the page's state, merged into what is there."
    • addedInput schema / properties / title / description
      Added value: +"A new title for the page."
    • 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"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / reset
      Added value: +{
      +  "description": "Reset jig: true sends nothing else. State goes back to the page's default and every stored row is deleted. The html and link stay. Only when the user asks.",
      +  "type": "boolean"
      +}
  3. Changed3 schema fields changed
    • changedInput schema / properties / edits / description
      Previous value: -"Find/replace on the current html, applied in order."New value: +"Find/replace on a file (default index.html), applied in order."
    • addedInput schema / properties / edits / items / properties / path
      Added value: +{
      +  "description": "The file; omitted means index.html.",
      +  "type": "string"
      +}
    • addedInput schema / properties / files
      Added value: +{
      +  "additionalProperties": {
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "description": "Write files of a project: { path: text }; a path set to null deletes it.",
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • changedInput schema / properties / slug / description
      Previous value: -"Rename the jig's link, bowmark.ai/jig/<slug>. The old link keeps working and redirects."New value: +"Rename the jig's link, the <slug> in bowmark.ai/jig/@<handle>/<slug>. The old link keeps working and redirects."
  5. Changed2 schema fields changed
    • addedInput schema / properties / mergedFrom
      Added value: +{
      +  "description": "After merging an update from `jig_pull_update`: the `theirsVersion` you merged. Send it with the merged `html` (or `edits`); the copy is then based on that version, and any new functions it calls wait for the user's approval.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / slug
      Added value: +{
      +  "description": "Rename the jig's link, bowmark.ai/jig/<slug>. The old link keeps working and redirects.",
      +  "maxLength": 60,
      +  "type": "string"
      +}
  6. Changed1 schema field changed
    • addedInput schema / properties / edits
      Added value: +{
      +  "description": "Find/replace on the current html, applied in order.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "find": {
      +        "type": "string"
      +      },
      +      "replace": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "find",
      +      "replace"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 50,
      +  "minItems": 1,
      +  "type": "array"
      +}
  7. Added

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations, the description discloses merge semantics (a null key removes it), that edits apply with each `find` matching exactly once, that the page refreshes itself within seconds (async propagation, no re-open needed), that `reset` deletes every stored row while keeping html and link, that slug changes redirect, and that newly called functions wait on user approval. The one tension is that `reset` deletes stored data while destructiveHint is false, but the description itself warns of this rather than contradicting the annotations. Concurrency and partial-failure behavior are not addressed.

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?

Four dense sentences, front-loaded with the primary action and followed by mode-specific clarifications and the usage rule. Nothing is filler, though the nested parentheticals for edits and files make it feel packed and slightly harder to scan than a bulleted structure would be.

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?

For a 10-parameter mutation tool with nested objects, the description covers the essential decision points, the live-refresh expectation, and the collaboration path. Return values are covered by the output schema, so their absence here is fine; only edge cases such as combining `html` with `edits` or slug collisions are left unstated.

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 real meaning: the uniqueness constraint on each `find`, that an edit's `path` selects its file, that `state` is a merge rather than a replacement, that `files` nulls delete, and how `mergedFrom` ties to a merged `jig_pull_update` version. Some of this duplicates the schema text for `slug`, `reset`, and `files`, so it is additive rather than fully compensatory.

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 opens with a specific verb and resource ("Change a page you opened with `jig_open`") and enumerates the distinct mutation modes: merge `state`, replace `html`/`title`, targeted `edits`, project `files`. It is clearly distinguishable from siblings like `jig_open`, `jig_get`, and `jig_pull_update`, which are named as the surrounding workflow.

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 the trigger condition explicitly ("Use this whenever the user asks, in chat, for the page to show something different") and an explicit exclusion ("do not call `jig_open` again"), plus the conditional path for `mergedFrom` after `jig_pull_update` and the constraint that `reset` is used "Only when the user asks." Alternatives and when-not guidance are both present.

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.