Skip to main content
Glama

Embers: Tabletop RPG Toolkit

Update an imagine world

imagine_update_world
Idempotent

PUT updates to one world by id. Caller must have 'edit' access. Only supplied fields are sent; imagine merges them onto the existing document. REQUIRES baseUpdatedAt: copy updatedAt from a fresh imagine_get_world read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesMongo `_id` of the world.
linkNoURL-safe slug for the world (lowercase letters, digits, hyphens). Imagine auto-suggests at create time when omitted.
menuNoSite menu entries — label + optional link/pageId/order.
nameNoWorld name.
imageNo
activeNo
publicNoWhether the world is public. Only Premium, VIP, and admin accounts can change whether a world is public; the server refuses the change from anyone else. A new world is public unless set otherwise.
faviconNo
summaryNoShort summary; capped at 255 characters. Cross-app convention (per dev-sites/AGENTS.md); the Mongoose World schema still accepts up to 500 as a legacy inconsistency being migrated, but new authoring should keep summaries under 255.
calendarNoOptional calendar definition (months[] + eras[]).
keywordsNo
showInviteNo
descriptionNoFull world description. Markdown supported.
customDomainNoOptional custom domain pointing at the world's public site.
baseUpdatedAtYesREQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write.
imageCarouselNo
isExampleWorldNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed20 schema fields changed
    • addedInput schema / $schema
      Added value: +"http://json-schema.org/draft-07/schema#"
    • addedInput schema / additionalProperties
      Added value: +{}
    • addedInput schema / properties / active
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / baseUpdatedAt
      Added value: +{
      +  "description": "REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / calendar
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Optional calendar definition (months[] + eras[]).",
      +  "properties": {
      +    "eras": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "name": {
      +            "type": "string"
      +          },
      +          "order": {
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "months": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "name": {
      +            "type": "string"
      +          },
      +          "order": {
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / customDomain
      Added value: +{
      +  "description": "Optional custom domain pointing at the world's public site.",
      +  "type": "string"
      +}
    • addedInput schema / properties / description
      Added value: +{
      +  "description": "Full world description. Markdown supported.",
      +  "type": "string"
      +}
    • addedInput schema / properties / favicon
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / id
      Added value: +{
      +  "description": "Mongo `_id` of the world.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / image
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / imageCarousel
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / isExampleWorld
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / keywords
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / link
      Added value: +{
      +  "description": "URL-safe slug for the world (lowercase letters, digits, hyphens). Imagine auto-suggests at create time when omitted.",
      +  "type": "string"
      +}
    • addedInput schema / properties / menu
      Added value: +{
      +  "description": "Site menu entries — label + optional link/pageId/order.",
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "label": {
      +        "description": "Required by Mongoose.",
      +        "type": "string"
      +      },
      +      "link": {
      +        "type": "string"
      +      },
      +      "order": {
      +        "type": "number"
      +      },
      +      "pageId": {
      +        "description": "Mongo `_id` reference (24-character hex string).",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / name
      Added value: +{
      +  "description": "World name.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / public
      Added value: +{
      +  "description": "Whether the world is public. Only Premium, VIP, and admin accounts can change whether a world is public; the server refuses the change from anyone else. A new world is public unless set otherwise.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / showInvite
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / summary
      Added value: +{
      +  "description": "Short summary; capped at 255 characters. Cross-app convention (per dev-sites/AGENTS.md); the Mongoose World schema still accepts up to 500 as a legacy inconsistency being migrated, but new authoring should keep summaries under 255.",
      +  "maxLength": 255,
      +  "type": "string"
      +}
    • addedInput schema / required
      Added value: +[
      +  "id",
      +  "baseUpdatedAt"
      +]
  2. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses optimistic concurrency (stale baseUpdatedAt causes OUT_OF_SYNC and no write), the partial-merge behavior, the permission requirement, and the need to reuse the returned updatedAt for follow-up writes. This adds substantial behavioral context and does not contradict any annotation.

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 tight sentences front-load the method and resource, then state the access requirement, the merge behavior, and the mandatory concurrency field. Every sentence earns its place, and the uppercase REQUIRES makes the critical constraint unmissable.

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?

For a 17-parameter update with nested objects, the description covers the essential call protocol: fresh read, merge semantics, permission, stale rejection, and post-write updatedAt handling. The remaining field-level details live in the schema and output schema, so nothing an agent needs to call this correctly is missing.

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?

The description adds critical parameter-level meaning by explaining that only supplied fields are sent and merged onto the existing document, preventing an agent from assuming omitted fields get reset. It also reinforces the baseUpdatedAt freshness rule, though the schema itself already documents baseUpdatedAt in detail.

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 'PUT updates to one world by id,' naming the HTTP method, action, and exact resource scope in one phrase. This clearly distinguishes it from sibling update tools like imagine_update_adventure and imagine_update_world_page, which target different resources.

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?

The description explicitly states the edit-access prerequisite, the required fresh imagine_get_world read, and the merge semantics for partial updates, giving an agent clear call-flow context. It does not explicitly name alternatives or state when not to use this tool, but for an update-by-id operation the guidance is strong enough.

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