Skip to main content
Glama

Update a quest

update_quest
DestructiveIdempotent

Replace a quest with a new full definition (same schema as create_quest). The link and QR code stay the same. Pass if_updated_at (updatedAt from get_quest) so a co-editor's newer changes are not overwritten: if someone saved in between, the call fails with edit_conflict — re-read and merge.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "quest_id": "<quest_id>",
      "quest": "<quest>"
    },
    "name": "update_quest"
  }
}

Input Schema

NameRequiredDescriptionDefault
questYes
quest_idYes
edit_tokenNoOnly for quests not created with this owner key (the part after # in an editUrl)
if_updated_atNoupdatedAt from get_quest; refuses to overwrite newer changes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / quest / properties / steps / items / properties / skippable
      Added value: +{
      +  "description": "place: show a \"Skip\" button so the recipient can pass the step without walking there (a demo, or someone far away)",
      +  "type": "boolean"
      +}
  2. Changed2 schema fields changed
    • addedInput schema / properties / quest / properties / paper
      Added value: +{
      +  "description": "Pattern of the wrapping paper on the gift box (default dots); its colour follows the theme",
      +  "enum": [
      +    "dots",
      +    "stripes",
      +    "stars",
      +    "hearts"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / quest / properties / to
      Added value: +{
      +  "description": "The recipient's first name (optional): shown as \"For …\" on the first screen and in the link's preview in messengers",
      +  "maxLength": 60,
      +  "type": "string"
      +}
  3. Changed10 schema fields changed
    • changedInput schema / properties / quest / properties / steps / items / description
      Previous value: -"One quest step. Fields per type — message: prompt. question: prompt, answers[], optional image (a photo the question is about; Quest+). choice: prompt, options[2..6], correct (0-based index). code: prompt, code (a secret the recipient finds offline, e.g. written on a card). puzzle: image (key from an upload with kind=image), size 3|4, optional prompt. media (Quest+): media (key from an upload with kind=media), mediaType audio|video, optional prompt. date: prompt, date (YYYY-MM-DD; the recipient picks it in a calendar). number: prompt, number, optional tolerance (any answer within ± tolerance counts). qr: prompt (where to look), code (letters and digits) — a treasure hunt: the creator prints a card with a QR code that opens playUrl?k=<code> and hides it; the recipient scans it with the phone camera or types the code printed under it. The builder (editUrl) prints these cards; you can also make the QR yourself from playUrl + \"?k=\" + the URL-encoded code. candles: optional prompt, count 1..${MAX_CANDLES} (more than ${FREE_CANDLES} is Quest+, e.g. the age), optional image (a photo on the cake, Quest+) — the recipient blows into the microphone (or taps) to put out birthday candles. message: optional scratch: true hides the text under a layer the recipient rubs off; optional image (a photo in the letter, under the layer when scratch is on; Quest+). qr: optional note, a line printed on the card (e.g. where the next card is), printed with Quest+ only. Any step: opensAt (Quest+ advent calendar)."New value: +"One quest step. Fields per type — message: prompt. question: prompt, answers[], optional image (a photo the question is about; Quest+). choice: prompt, options[2..6], correct (0-based index). code: prompt, code (a secret the recipient finds offline, e.g. written on a card). puzzle: image (key from an upload with kind=image), size 3|4, optional prompt. media (Quest+): media (key from an upload with kind=media), mediaType audio|video, optional prompt. date: prompt, date (YYYY-MM-DD; the recipient picks it in a calendar). number: prompt, number, optional tolerance (any answer within ± tolerance counts). qr: prompt (where to look), code (letters and digits) — a treasure hunt: the creator prints a card with a QR code that opens playUrl?k=<code> and hides it; the recipient scans it with the phone camera or types the code printed under it. The builder (editUrl) prints these cards; you can also make the QR yourself from playUrl + \"?k=\" + the URL-encoded code. candles: optional prompt, count 1..${MAX_CANDLES} (more than ${FREE_CANDLES} is Quest+, e.g. the age), optional image (a photo on the cake, Quest+) — the recipient blows into the microphone (or taps) to put out birthday candles. message: optional scratch: true hides the text under a layer the recipient rubs off; optional image (a photo in the letter, under the layer when scratch is on; Quest+). qr: optional note, a line printed on the card (e.g. where the next card is), printed with Quest+ only. place: prompt (where to go), lat, lng, optional radius in metres — hot or cold: the recipient walks there with the phone (GPS) and the screen warms up as they get closer; the coordinates never reach their browser. spot: prompt, image (a photo or a map screenshot), x and y (0..1 shares of the photo's width and height, from its top-left corner), optional r — the recipient taps the right spot on the photo. Any step: opensAt (Quest+ advent calendar)."
    • changedInput schema / properties / quest / properties / steps / items / properties / image / description
      Previous value: -"puzzle (required); question, message, candles (optional, Quest+): image key from an upload with kind=image"New value: +"puzzle, spot (required); question, message, candles (optional, Quest+): image key from an upload with kind=image"
    • addedInput schema / properties / quest / properties / steps / items / properties / lat
      Added value: +{
      +  "description": "place: latitude of the spot",
      +  "maximum": 90,
      +  "minimum": -90,
      +  "type": "number"
      +}
    • addedInput schema / properties / quest / properties / steps / items / properties / lng
      Added value: +{
      +  "description": "place: longitude of the spot",
      +  "maximum": 180,
      +  "minimum": -180,
      +  "type": "number"
      +}
    • addedInput schema / properties / quest / properties / steps / items / properties / r
      Added value: +{
      +  "description": "spot: how big the target is, as a share of the photo (default 0.1)",
      +  "enum": [
      +    0.06,
      +    0.1,
      +    0.15
      +  ],
      +  "type": "number"
      +}
    • addedInput schema / properties / quest / properties / steps / items / properties / radius
      Added value: +{
      +  "description": "place: how close counts, in metres (default 50)",
      +  "enum": [
      +    25,
      +    50,
      +    100,
      +    250
      +  ],
      +  "type": "integer"
      +}
    • changedInput schema / properties / quest / properties / steps / items / properties / type / enum
      Previous value: -[
      -  "message",
      -  "question",
      -  "choice",
      -  "code",
      -  "puzzle",
      -  "media",
      -  "date",
      -  "number",
      -  "qr",
      -  "candles"
      -]New value: +[
      +  "message",
      +  "question",
      +  "choice",
      +  "code",
      +  "puzzle",
      +  "media",
      +  "date",
      +  "number",
      +  "qr",
      +  "candles",
      +  "place",
      +  "spot"
      +]
    • addedInput schema / properties / quest / properties / steps / items / properties / x
      Added value: +{
      +  "description": "spot: horizontal position of the right spot, share of the photo width from the left",
      +  "maximum": 1,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / quest / properties / steps / items / properties / y
      Added value: +{
      +  "description": "spot: vertical position, share of the photo height from the top",
      +  "maximum": 1,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / quest / properties / unwrap
      Added value: +{
      +  "description": "How the recipient opens the gift at the end: hands (default) — pull the ribbon to untie the bow, then tap to tear the paper off; tap — one tap on the box",
      +  "enum": [
      +    "hands",
      +    "tap"
      +  ],
      +  "type": "string"
      +}
  4. Changed1 schema field changed
    • removedInput schema / properties / quest / properties / dynamicQr
      Removed value: -{
      -  "description": "Mint a dynamic, trackable qrilo QR code (qrUrl)",
      -  "type": "boolean"
      -}
  5. Changed10 schema fields changed
    • changedInput schema / properties / quest / properties / steps / items / description
      Previous value: -"One quest step. Fields per type — message: prompt. question: prompt, answers[], optional image (a photo the question is about; Quest+). choice: prompt, options[2..6], correct (0-based index). code: prompt, code (a secret the recipient finds offline, e.g. written on a card). puzzle: image (key from an upload with kind=image), size 3|4, optional prompt. media (Quest+): media (key from an upload with kind=media), mediaType audio|video, optional prompt. Any step: opensAt (Quest+ advent calendar)."New value: +"One quest step. Fields per type — message: prompt. question: prompt, answers[], optional image (a photo the question is about; Quest+). choice: prompt, options[2..6], correct (0-based index). code: prompt, code (a secret the recipient finds offline, e.g. written on a card). puzzle: image (key from an upload with kind=image), size 3|4, optional prompt. media (Quest+): media (key from an upload with kind=media), mediaType audio|video, optional prompt. date: prompt, date (YYYY-MM-DD; the recipient picks it in a calendar). number: prompt, number, optional tolerance (any answer within ± tolerance counts). qr: prompt (where to look), code (letters and digits) — a treasure hunt: the creator prints a card with a QR code that opens playUrl?k=<code> and hides it; the recipient scans it with the phone camera or types the code printed under it. The builder (editUrl) prints these cards; you can also make the QR yourself from playUrl + \"?k=\" + the URL-encoded code. candles: optional prompt, count 1..${MAX_CANDLES} (more than ${FREE_CANDLES} is Quest+, e.g. the age), optional image (a photo on the cake, Quest+) — the recipient blows into the microphone (or taps) to put out birthday candles. message: optional scratch: true hides the text under a layer the recipient rubs off; optional image (a photo in the letter, under the layer when scratch is on; Quest+). qr: optional note, a line printed on the card (e.g. where the next card is), printed with Quest+ only. Any step: opensAt (Quest+ advent calendar)."
    • changedInput schema / properties / quest / properties / steps / items / properties / code / description
      Previous value: -"code: the secret code"New value: +"code: the secret code; qr: the code on the printed card (up to 40 characters)"
    • addedInput schema / properties / quest / properties / steps / items / properties / count
      Added value: +{
      +  "description": "candles: how many candles (default 5; more than 10 is Quest+)",
      +  "maximum": 60,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / quest / properties / steps / items / properties / date
      Added value: +{
      +  "description": "date: the right date, YYYY-MM-DD",
      +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +  "type": "string"
      +}
    • changedInput schema / properties / quest / properties / steps / items / properties / image / description
      Previous value: -"puzzle (required) or question (optional): image key from an upload with kind=image"New value: +"puzzle (required); question, message, candles (optional, Quest+): image key from an upload with kind=image"
    • addedInput schema / properties / quest / properties / steps / items / properties / note
      Added value: +{
      +  "description": "qr: a line printed on the card (Quest+)",
      +  "maxLength": 140,
      +  "type": "string"
      +}
    • addedInput schema / properties / quest / properties / steps / items / properties / number
      Added value: +{
      +  "description": "number: the right number",
      +  "type": "number"
      +}
    • addedInput schema / properties / quest / properties / steps / items / properties / scratch
      Added value: +{
      +  "description": "message: hide the text under a scratch layer",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / quest / properties / steps / items / properties / tolerance
      Added value: +{
      +  "description": "number: answers within ± this count as right (default 0)",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • changedInput schema / properties / quest / properties / steps / items / properties / type / enum
      Previous value: -[
      -  "message",
      -  "question",
      -  "choice",
      -  "code",
      -  "puzzle",
      -  "media"
      -]New value: +[
      +  "message",
      +  "question",
      +  "choice",
      +  "code",
      +  "puzzle",
      +  "media",
      +  "date",
      +  "number",
      +  "qr",
      +  "candles"
      +]
  6. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=true; the description adds the meaningful context that this is a whole-document overwrite, that the link/QR are preserved, and that stale writes are rejected with a specific error code (edit_conflict) plus the recovery procedure. That error path is the kind of behavior an agent cannot infer from annotations. It does not mention the edit_token requirement for non-owner quests, which is the one notable omission.

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

Conciseness5/5

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

Three sentences, each carrying distinct payload: replacement semantics and schema reference first, preserved artifacts second, concurrency protocol and failure recovery third. No filler and nothing buried.

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 destructive nested-object write with no output schema, the description carries the essential load: overwrite risk, stability of the public link, and the conflict-handling protocol. The nested quest schema is documented in exhaustive per-field detail, so it needn't be repeated. Only the edit_token path for non-owner quests is unaddressed in the description.

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 description coverage is 50%, but the description compensates well for the most consequential parameter by explaining where if_updated_at comes from (updatedAt from get_quest) and what happens on mismatch. quest_id and quest are implied by the replace framing and the create_quest schema reference. edit_token is left entirely to the schema.

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?

States a specific verb and resource ('Replace a quest') and immediately clarifies the semantics: a full replacement, not a partial patch, using the create_quest schema. It also names the invariant side effects (link and QR code unchanged), so an agent can distinguish it from create_quest or set_custom_link without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives actionable when-to-use guidance for the concurrency parameter: pass if_updated_at from get_quest, and on edit_conflict re-read and merge. It names get_quest as the prerequisite step. It stops short of an explicit 'use create_quest instead when making a new quest' exclusion, but the replace framing implies it.

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.

Resources