Skip to main content
Glama

legendkeeper-mcp

legendkeeper-mcp: let AI assistants read and build your LegendKeeper worlds

CI PyPI Docker image MCP Registry License: MIT

An MCP server that lets AI assistants (Claude, Copilot, Cursor, …) read and build your LegendKeeper worlds: wiki pages, infobox facts, map pins, timelines, tags, templates and images, through LegendKeeper's official v3 REST API.

Unofficial. This project is not made, endorsed or supported by LegendKeeper. It runs locally on your machine with your own API key.

You: Create a tavern called The Drunken Dragon in Waterdeep, give it an infobox with its owner and
     a pin on the city map, and mention it on Volo's page.
Claude: (search → create_resource → set_facts → create_map_feature → write_page) Done! ...

Contents

Related MCP server: mcp-obsidian

Features

  • 31 curated tools designed for LLMs. Resources accept names as well as ids, and errors explain how to fix them. An api_request escape hatch reaches every other v3 endpoint.

  • Pages as Markdown, both ways. [[Wiki Links]] become real LegendKeeper mentions. Callouts, GM-only secrets, collapsible sections, task lists, tables and images are supported. Blocks Markdown can't express (infoboxes, embeds, collections…) are preserved verbatim on rewrite. See How pages are edited.

  • Section-level editing: append, prepend, replace or extend one heading's section without touching the rest of the page. Every write is version-checked (If-Match), so concurrent edits in the app are never silently overwritten.

  • Structured worldbuilding: infobox and sidebar facts, map pins/regions/paths (lat/lng or image pixels), timeline events and lanes (human dates such as "3 March 1204"), templates, batch creation of up to 100 linked resources, and image uploads from disk or URL.

  • Multiple worlds from one server (one API key per world), plus a read-only mode.

  • Two transports: stdio for desktop clients, or a long-running Docker container serving streamable HTTP behind a bearer token.

  • Robust client: retries with backoff, honors Retry-After, idempotency keys on every POST so retries never double-create, and rate-limit tracking.

  • Contract-tested: the test suite runs against a fake API that validates every request and response against LegendKeeper's published OpenAPI spec. A weekly CI job re-checks against the latest spec.

Requirements

  1. A LegendKeeper project whose owner is on a paid plan. LegendKeeper only accepts API keys for those (a trial does not count), and answers 402 PAID_PLAN_REQUIRED otherwise.

  2. An API key: in LegendKeeper open your project, go to Project Settings → Developers → API Keys, name the key, pick a role and create it. Copy the lk_… secret; it is shown only once.

    • Member keys can read and write content.

    • Admin keys can also see and create hidden resources and GM secrets, read tags (list_tags falls back to counting tags itself for Member keys), see member emails and save templates.

    • A key never has more rights than its creator, and only works in its own project.

  3. One of: uv (recommended), Docker, or Python ≥ 3.11 with pip.

Quick start

Pick one. All of them read the key from LEGENDKEEPER_API_KEY.

uvx (no install):

LEGENDKEEPER_API_KEY=lk_... uvx legendkeeper-mcp check   # verify the key

Docker:

docker run -i --rm -e LEGENDKEEPER_API_KEY=lk_... ghcr.io/chase-roohms/legendkeeper-mcp:latest check

pip:

pip install legendkeeper-mcp
legendkeeper-mcp check

check prints the world each configured key opens, then exits. Without check, the command starts the MCP server on stdio, which is what desktop clients launch for you (see below).

Before the first PyPI release, use uvx --from git+https://github.com/chase-roohms/legendkeeper-mcp legendkeeper-mcp, or build the image yourself with docker build -t legendkeeper-mcp ..

Long-running HTTP server (Docker Compose):

cp .env.example .env              # set LEGENDKEEPER_API_KEY and MCP_AUTH_TOKEN (openssl rand -hex 32)
docker compose up -d              # serves http://localhost:8000/mcp, bound to 127.0.0.1 only
curl http://localhost:8000/healthz

Point HTTP-capable clients at http://localhost:8000/mcp with the header Authorization: Bearer <MCP_AUTH_TOKEN>. Images placed in ./uploads can be uploaded with upload_image (source: /uploads/<file>).

Client setup

Ready-to-use files are in examples/.

Claude Desktop: add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude:

{
  "mcpServers": {
    "legendkeeper": {
      "command": "uvx",
      "args": ["legendkeeper-mcp"],
      "env": { "LEGENDKEEPER_API_KEY": "lk_your_key_here" }
    }
  }
}

VS Code (.vscode/mcp.json, the key is prompted for and stored securely):

{
  "inputs": [{ "type": "promptString", "id": "lk-key", "description": "LegendKeeper API key", "password": true }],
  "servers": {
    "legendkeeper": {
      "type": "stdio",
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "LEGENDKEEPER_API_KEY", "ghcr.io/chase-roohms/legendkeeper-mcp:latest"],
      "env": { "LEGENDKEEPER_API_KEY": "${input:lk-key}" }
    }
  }
}

Claude Code:

claude mcp add legendkeeper --env LEGENDKEEPER_API_KEY=lk_... -- uvx legendkeeper-mcp

Cursor, Windsurf, others: same command/args/env as Claude Desktop, in the client's MCP config file.

Configuration

Everything is configured with environment variables. CLI flags (--transport, --host, --port, --read-only) override them.

Variable

Default

Description

LEGENDKEEPER_API_KEY

—

API key for the project named default.

LEGENDKEEPER_API_KEY_<NAME>

—

Additional worlds. LEGENDKEEPER_API_KEY_HOMEBREW becomes project homebrew.

LEGENDKEEPER_API_KEY_FILE, LEGENDKEEPER_API_KEY_<NAME>_FILE

—

Read the key from a file (Docker secrets).

LEGENDKEEPER_DEFAULT_PROJECT

default, else the first name

Which world tools use when project is omitted.

LEGENDKEEPER_PROJECT_ID, LEGENDKEEPER_PROJECT_ID_<NAME>

discovered

Skip the lookup of the project id behind a key.

LEGENDKEEPER_READ_ONLY

false

Only register reading tools; api_request allows GET only.

LEGENDKEEPER_BASE_URL

https://www.legendkeeper.com

API origin (for proxies and mocks).

LEGENDKEEPER_TIMEOUT

30

Request timeout in seconds.

LEGENDKEEPER_MAX_RETRIES

3

Retries for 429/5xx/network errors.

LEGENDKEEPER_UPLOAD_ROOT

unrestricted (/uploads in Docker)

upload_image may only read files under this directory.

LEGENDKEEPER_MAX_UPLOAD_MB

25

Maximum image size.

LEGENDKEEPER_ALLOW_URL_UPLOADS

true

Allow upload_image to download from http(s) URLs.

LEGENDKEEPER_LOG_LEVEL

INFO

Log level (logs go to stderr; keys are never logged).

MCP_TRANSPORT

stdio

stdio or http (streamable HTTP).

MCP_HOST

127.0.0.1 (0.0.0.0 in Docker)

HTTP bind address.

MCP_PORT

8000

HTTP port.

MCP_PATH

/mcp

HTTP endpoint path.

MCP_AUTH_TOKEN, MCP_AUTH_TOKEN_FILE

—

Bearer token required on every HTTP request (except /healthz).

MCP_ALLOW_UNAUTHENTICATED

false

Permit HTTP on a non-loopback address without a token (not recommended).

MCP_ALLOWED_HOSTS

—

Comma-separated host:port values; enables DNS-rebinding protection (e.g. localhost:8000).

Multiple worlds

LEGENDKEEPER_API_KEY_HOMEBREW=lk_aaa
LEGENDKEEPER_API_KEY_STRAHD=lk_bbb
LEGENDKEEPER_DEFAULT_PROJECT=homebrew

Every tool takes an optional project argument ("strahd"), and list_projects shows what is configured.

Tools

Area

Tools

Discover

list_projects, browse_tree, search, get_resource, list_tags, list_templates, list_calendars, list_members, list_assets

Read

read_document: pages as Markdown, maps as features with coordinates, timelines as lanes/events, boards as text. format: "json" returns raw API data.

Pages

write_page (modes append, prepend, replace, replace_section, append_to_section)

Resources

create_resource, create_resources (batch ≤ 100, nested via key/parent_key), update_resource (name, tags add/remove, aliases, icon, banner, hidden, locked), move_resource, delete_resource, restore_resource, create_from_template

Documents

create_document (page/map/time/board), update_document, delete_document

Facts

set_facts: key-value facts in the page infobox (created if missing) or the sidebar; null removes a fact

Maps

create_map_feature (pin/label/region/path/folder, lat/lng or pixel coordinates, link to a page), update_map_feature, delete_map_feature

Timelines

create_timeline_event (human dates parsed in the timeline's calendar, lane by name, created on demand), update_timeline_event, delete_timeline_event, create_timeline_lane

Assets

upload_image (local file or URL → asset URL usable in pages, banners and map images)

Anything else

api_request: any v3 endpoint of the project (boards, calendars, block-level edits, invites, restores…)

The server also exposes two MCP resources the assistant can read: legendkeeper://guides/markdown (the Markdown dialect) and legendkeeper://guides/style (conventions for tags, icons, infoboxes, pins and events, adapted from LegendKeeper's style guide). Write tools are annotated so clients can ask for confirmation; destructive tools also require confirm: true.

How pages are edited (Markdown)

LegendKeeper stores pages as a tree of typed blocks, not Markdown. This server converts in both directions:

Markdown

LegendKeeper

# … ######, paragraphs, - lists, 1. lists, > quotes, ``` code, ---, GFM tables

the matching blocks

- [ ] task / - [x] done

task list

> [!info], [!note], [!success]/[!tip], [!warning], [!error]/[!caution]

callout

> [!secret]

secret block (GM-only, hidden from players and public pages)

> [!expand] Title

collapsible section

**b**, *i*, ~~s~~, `c`, <u>, <sub>, <sup>, <span style="color:#…; background-color:#…">

text marks and colors

[[Name]], [[Name|label]], [label](lk://resources/<id>)

mention (link to another page)

![alt](asset-url)

image (upload first with upload_image)

```lk-block + JSON

any raw block (infobox, embed, meter, collection…)

When a page is read, blocks Markdown can't express appear as readable regions:

<!-- lk:keep id="kq3…" kind="infobox" -->
**Infobox**
*Facts*
- **Ruler:** [Princess Bubblegum](lk://resources/pb…)
<!-- /lk:keep -->

Writing those marker lines back preserves the original block exactly. Edits inside the region are ignored with a warning; use set_facts, or read with opaque_blocks: "json" to edit the raw JSON. In replace mode, paragraphs and other blocks whose content didn't change are matched to the originals. Their ids and any styling Markdown can't show (colors, alignment, callout icons) are kept.

The converter is fuzz-tested with Hypothesis for exact round trips, including tricky punctuation, nested marks and escaping.

Safety

  • Read-only mode (LEGENDKEEPER_READ_ONLY=true or --read-only) doesn't register write tools at all.

  • Confirmation: delete_* tools and api_request DELETE refuse to run without confirm: true. Deleted resources go to LegendKeeper's trash and can be brought back with restore_resource.

  • No lost updates: page writes send the version they were based on (If-Match) and retry once from a fresh read on conflict.

  • No duplicates on retry: every POST carries an idempotency key.

  • HTTP mode refuses to listen on a non-loopback address without MCP_AUTH_TOKEN; compose binds to 127.0.0.1 only, with a read-only filesystem, all capabilities dropped and a non-root user.

  • Uploads: only real JPEG/PNG/GIF/WebP files (checked by content) up to the size limit, optionally restricted to LEGENDKEEPER_UPLOAD_ROOT.

  • Secrets: keys are never logged (only masked as lk_ab…wxyz) and never sent anywhere but LegendKeeper. Signed upload URLs receive the image bytes, not the key.

Troubleshooting

Symptom

Fix

402 PAID_PLAN_REQUIRED

The project owner needs a paid LegendKeeper plan (trials don't count).

401 UNAUTHENTICATED

Key missing, mistyped, revoked or expired. Run legendkeeper-mcp check.

403 FORBIDDEN

The key's role (or its creator's) is too low, e.g. hidden resources or tags with a Member key.

403 WRONG_PROJECT

Keys only work in their own world; configure one key per world.

429 RATE_LIMITED

LegendKeeper allows 120 writes/min and 300 requests/min per key. Wait a minute; batch with create_resources.

Images rejected with VALIDATION_ERROR

Image URLs must be LegendKeeper asset URLs; use upload_image first.

Client shows no tools

Check the client's MCP logs. Run the configured command yourself; config errors are printed to stderr with exit code 2.

Development

uv sync                       # create .venv with dev dependencies
uv run pytest                 # full test suite (downloads the OpenAPI spec once into tests/.cache)
uv run ruff check . && uv run ruff format --check . && uv run mypy
uv run legendkeeper-mcp       # run from source
npx @modelcontextprotocol/inspector uv run legendkeeper-mcp   # poke at it interactively

Testing layers:

  • tests/test_markdown*.py: converter unit tests and Hypothesis property tests (round trips must be exact).

  • tests/test_tools.py: every tool end to end through a real MCP client session against tests/fake_lk.py, an in-memory LegendKeeper. When the OpenAPI spec is available, every request must hit a real route with a schema-valid body, and every fake response must match the documented response schema. CI requires the spec (LK_REQUIRE_SPEC=1).

  • tests/test_live.py: opt-in smoke tests against the real API. Write tests build everything under one [mcp-test] … sandbox resource and delete it afterwards:

    LEGENDKEEPER_LIVE_TESTS=1 LEGENDKEEPER_LIVE_WRITE=1 LEGENDKEEPER_API_KEY=lk_... uv run pytest tests/test_live.py -v

Project layout:

src/legendkeeper_mcp/
  client.py      async HTTP client (auth, retries, idempotency, pagination, errors)
  config.py      environment configuration
  service.py     per-project sessions, project-id discovery, cached resource index
  documents.py   reading/writing documents (page Markdown, maps, timelines, boards)
  markdown/      Markdown <-> block conversion (parse, render, merge)
  tools/         MCP tool definitions
  server.py      server assembly; http_app.py streamable HTTP + bearer auth; cli.py entry point

Releasing

CI runs on every push and PR: lint, mypy, tests on Linux/macOS/Windows (Python 3.11-3.13), a wheel build, and a Docker build with stdio/HTTP smoke tests.

To release, bump version in pyproject.toml, src/legendkeeper_mcp/__init__.py and server.json (the server and package versions plus the image tag), update CHANGELOG.md, commit, then git tag v0.2.0 && git push --tags. The release workflow then:

  1. verifies the tag matches the package version and reruns CI,

  2. publishes to PyPI using trusted publishing,

  3. pushes a multi-arch (amd64/arm64) image with SBOM and provenance to ghcr.io/<owner>/legendkeeper-mcp,

  4. creates a GitHub release with the built distributions,

  5. publishes server.json to the official MCP Registry as io.github.chase-roohms/legendkeeper-mcp (GitHub OIDC login, no secret needed). The registry checks ownership through the mcp-name comment at the top of this README, which PyPI shows as the package description, and the io.modelcontextprotocol.server.name label on the Docker image.

One-time setup: on PyPI, add a pending trusted publisher for project legendkeeper-mcp → this repository, workflow release.yml, environment pypi, and create a pypi environment in the repository settings. GHCR needs no setup. After the first push, make the package public in its GitHub package settings.

License

MIT. LegendKeeper is a trademark of its respective owner; this project only uses its public API.

Available Tools

31 tools
api_requestA

Call any LegendKeeper REST v3 endpoint of this project directly (advanced: boards, calendars, block-level edits, properties, invites, restores…). Returns the raw JSON response. Writes are disabled in read-only mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoJSON request body.
pathYesPath relative to the project, e.g. '/resources/<id>/docs/<docId>/blocks', '/calendars', '/resources/<id>/properties'. See https://www.legendkeeper.com/developers/api/.
queryNoQuery-string parameters.
methodYes
confirmNoRequired (true) for DELETE.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
if_matchNoDocument/calendar version for optimistic locking.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), and the description adds genuine value beyond them: it discloses the raw JSON return shape and the read-only-mode write restriction. It does not explain auth, rate limits, or why destructiveHint=false despite DELETE being available, but with annotations carrying the safety burden this is solid.

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-loaded with the core action, then scope examples, return format, and constraint. No wasted wording.

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 generic 7-parameter REST pass-through, the description is nearly complete: it states scope, examples, return format, and the read-only constraint, and the schema supplies the rest. Minor omissions (auth expectations, pagination/error behavior for arbitrary endpoints) keep it just short of full.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 86%, so the schema already documents body, path, query, confirm, project and if_match with examples and defaults. The description adds nothing parameter-specific (e.g. how method interacts with confirm, or path formats), so the baseline 3 for high-coverage schemas applies.

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 names a specific verb ('Call') and resource ('any LegendKeeper REST v3 endpoint of this project directly'), and the parenthetical examples (boards, calendars, block-level edits, properties, invites, restores) hint at the advanced/raw-escape-hatch role no sibling fills. It is clear what the tool does, though the differentiation from the many specific CRUD siblings is left implicit rather than stated.

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

Usage Guidelines3/5

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

The 'advanced:' framing implies this is for operations not covered by the specific tools, and 'Writes are disabled in read-only mode' gives one situational constraint. However, it never explicitly says when to prefer api_request over siblings like create_document or update_map_feature, leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browse_treeA
Read-onlyIdempotent

Show the resource tree (the world's wiki hierarchy) as an indented outline with ids, icons, tags and child counts. Start here to see how a world is organized.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoHow many levels to expand.
parentNoResource id or name to list below. Omit for the top of the world.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
refreshNoBypass the 60-second resource cache.
show_document_typesNoShow document types for resources that are not a single page.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the return shape and framing as an entry point, but says nothing beyond the schema about the 60-second cache, traversal cost of depth, or result size for large worlds.

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?

Two sentences, front-loaded with the action and output shape and closed with the orienting purpose. No filler and nothing repeated from annotations or the schema.

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?

There is no output schema, so the description carries the burden of describing returns – and it does, listing ids, icons, tags and child counts from an indented outline. Complete enough for an agent to call it correctly, with only minor gaps around default depth behaviour and output size on large worlds.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds no parameter-level meaning beyond the schema (it does not explain default depth of 2, the effect of parent scope, or the refresh cache behaviour) – it only describes the visible output fields.

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 specific verb ('Show') and resource ('the resource tree / the world's wiki hierarchy') and additionally describes the output form: an indented outline with ids, icons, tags and child counts. That is far more informative than a tautology, though it does not explicitly name a sibling it differs from (e.g. get_resource or search).

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

Usage Guidelines3/5

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

'Start here to see how a world is organized' positions the tool as an orientation/entry point, which is implied usage guidance. However, no alternative is named and no condition for choosing browse_tree over get_resource or search is given, so the agent must infer when this is preferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_documentA

Add a document (tab) to a resource: a page, a map, a timeline or a board. A resource holds at most 5.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
typeYespage (wiki text), map, time (timeline) or board (whiteboard).
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
resourceYesResource id, or its exact name/alias (case-insensitive).
is_hiddenNoHide the document from non-admins.
calendar_idNoFor timelines: calendar id from list_calendars (e.g. 'gregorian').
map_image_asset_idNoFor maps: id of an uploaded image asset to use as the map.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=false, openWorld=true, so the safety profile is covered. The description still earns credit for disclosing a hard non-obvious capacity constraint ('A resource holds at most 5'), which materially affects invocation ordering. It does not say what happens at the limit or what permissions are required.

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?

Two short sentences, zero filler, and the essential information (what is created and where) is front-loaded ahead of the capacity limit.

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 7-parameter create tool with strong schema coverage and no output schema, the description plus schema give an agent enough to invoke correctly, and the sibling references list_projects/list_calendars live in the schema. It omits failure behavior at the 5-document cap and permission requirements, which would round it out.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 86%, so the schema already documents resource, project, is_hidden, calendar_id, map_image_asset_id and the type enum. The description's list of types largely duplicates the enum description ('page (wiki text), map, time (timeline) or board') and adds no syntax or format detail beyond it. Baseline 3 is appropriate when the schema does the heavy lifting.

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?

States a specific verb and resource and clarifies what a 'document' actually is (a tab) plus the parent it attaches to ('a resource: a page, a map, a timeline or a board'), which the bare name does not convey. It stops short of naming a sibling (create_resource, update_document, create_from_template), so the agent gets a clear purpose but no explicit differentiation.

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

Usage Guidelines3/5

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

Usage is implied by the verb 'Add ... to a resource' rather than stated: no when-to-use conditions, no guidance on choosing this over create_resource, create_from_template or update_document, and no prerequisites. The 'at most 5' note is a constraint, not routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_from_templateA

Create a resource from a template (copies its documents, properties, icon and tags).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName of the new resource (default: template name).
parentNoParent id or name; omit for top level.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
templateYesTemplate id or name (see list_templates).
include_childrenNoAlso copy the template's child resources.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), so the bar is lower. The description still adds real behavioral value by disclosing what gets copied (documents, properties, icon, tags), which goes beyond the annotations. It omits conflict/permission behavior and any warning that this is a non-idempotent write.

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?

A single front-loaded sentence with zero filler; the parenthetical efficiently enumerates the copied content. Every element earns its place with no redundancy.

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 write tool with no output schema, the description plus fully-described schema gives an agent enough to invoke correctly: what is created and from what. It is only marginally short of complete because it does not signal that this is a non-idempotent creation that can produce duplicates on retry.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters (including name default, parent, project, template, include_children) are already documented in the schema. The description adds nothing beyond it, which meets the baseline 3 when schema does the heavy lifting.

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?

States a specific verb and resource ('Create a resource from a template') and clarifies what the operation copies. It is distinguishable from create_resource/create_resources by the template-driven nature, but it never names those siblings explicitly, leaving the differentiation to inference.

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

Usage Guidelines3/5

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

Usage is implied: use this when creating a resource from an existing template rather than from scratch. There is no explicit when-to-use vs create_resource, no prerequisites, and no mention of the required template/listing step beyond the schema's reference to list_templates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_map_featureA

Add a pin, label, region, path or folder to a map document. Coordinates are [lat, lng] in the map's frame (read_document on the map shows its bounds), or image pixels with pixel_coordinates=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
linkNoResource id/name (or lk:// URI) the feature opens when clicked.
nameYes
typeNoFeature type.pin
colorNoRegion fill/border or path line color.
extraNoAny other createFeature fields (labelSize, fillOpacity, strokeWidth, textColor…).
folderNoId of a folder feature to nest this feature in.
pointsNoVertices of a region (polygon) or a path (polyline).
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
positionNoPin/label position.
resourceYesResource id, or its exact name/alias (case-insensitive).
is_hiddenNo
icon_colorNoPin shape color (only with a shape).
icon_glyphNoPin icon: a Font Awesome name, e.g. 'castle'.
icon_shapeNoShape behind a pin's glyph; default 'none' (bare glyph).
pixel_coordinatesNoTreat position/points as image pixels [x, y] from the top-left corner.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare this is a non-read-only, non-idempotent, non-destructive, open-world write, so the safety profile is covered. The description usefully adds that coordinates are interpreted in the map's frame unless pixel mode is on, which is behavioral context beyond the annotations, but it says nothing about permission requirements, whether repeated calls duplicate features, or how resource/document resolution behaves when names are ambiguous.

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?

Two sentences, no filler, and the most important fact (what can be added, and to what) is front-loaded ahead of the coordinate-mode caveat. Every clause earns its place.

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

Completeness3/5

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

For a 16-parameter creation tool with no output schema, the description omits the parameter-to-type mapping that an agent most needs: that pins/labels require `position`, and regions/paths require `points`, while `name` and `resource` are the only required fields. Annotations do cover mutability, so the gap is not fatal, but the schema alone does not force the agent to supply geometry for the non-pin types.

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 already 88%, so the schema carries most of the burden; the baseline is 3. The description still adds value by explaining that coordinates are relative to the map's frame and by naming read_document as the way to learn the bounds, knowledge that is not present in any individual property description.

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+resource ('Add a pin, label, region, path or folder to a map document') and enumerates exactly the feature types in the `type` enum, so the agent immediately knows the scope. It is clearly distinguishable from siblings like update_map_feature and delete_map_feature, which operate on existing features.

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

Usage Guidelines3/5

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

The second sentence gives real usage context for coordinates ([lat, lng] in the map's frame, or pixels with pixel_coordinates=true) and points the agent at read_document to discover the map bounds. However, it never says when to prefer this tool over update_map_feature, nor what preconditions exist (e.g. the resource/document must already exist, folder nesting must reference an existing folder feature).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_resourceB

Create a resource (wiki article, location, character…), optionally with page content in Markdown. Reuse existing tags (list_tags) and give it an icon. Returns the new id and its documents.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
tagsNo
afterNoSibling (id or name) to place this one after.
parentNoParent resource id or name. Omit (or 'root') for the top level.
aliasesNo
contentNoMarkdown for the new page. [[Name]] links become mentions.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
is_hiddenNoCreate hidden (ADMIN keys only).
icon_colorNo
icon_glyphNoFont Awesome icon name, e.g. 'dragon'.
icon_shapeNo
calendar_idNoCalendar for a `time` document.
document_nameNoFirst document's name.
document_typeNoType of the first document when there is no `content` (default: blank).

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare a non-readonly, non-idempotent, open-world write, so safety is covered elsewhere. The description's useful addition is the return contract ('Returns the new id and its documents'), valuable since no output schema exists, but it says nothing about permissions, side effects on the tree, or ordering behavior.

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?

Two tight sentences, core purpose front-loaded and follow-up hints trailing. No filler, though the second sentence mixes tagging and icon advice somewhat loosely.

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

Completeness3/5

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

For a 14-parameter tool with no output schema, the description covers the common create flow but omits the richer document modes (map/time/board via document_type, calendar_id, document_name) that the schema exposes. Adequate but with clear gaps for an agent needing the full capability surface.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 64% schema description coverage, the schema already documents most of the nuanced parameters (after, parent, content, is_hidden, document_type). The description reinforces 'content in Markdown' and icons but adds little syntax beyond that, so baseline 3 is appropriate.

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?

Specific verb+resource with a clarifying gloss ('wiki article, location, character…') that tells an agent what a resource actually is. However, it doesn't distinguish itself from the sibling create_resources (bulk) or create_from_template, which is a real ambiguity in a crowded creation family.

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

Usage Guidelines3/5

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

The hints 'Reuse existing tags (list_tags)' and 'give it an icon' point at related tools and imply a workflow, but there is no explicit when-to-use/when-not guidance versus the sibling creators. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_resourcesA

Create up to 100 resources in one atomic request: ideal for scaffolding a region, a cast of NPCs or a whole hierarchy. Give items a key and nest later items under them with parent_key.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
resourcesYes1-100 resources, created in order.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover readOnly=false, destructive=false, idempotent=false and openWorld=true, so the safety profile is already known. The description adds a trait the annotations do not encode: the request is 'atomic', implying all-or-nothing semantics. It does not state the failure/rollback behavior explicitly or any auth/rate-limit constraints.

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?

Two tight sentences, zero filler. The batch scope and atomicity are front-loaded, and the key/parent_key workflow follows as a practical second sentence.

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 batch mutation tool with annotations present and no output schema, the description covers the essentials: scale limit, atomicity, ordering, and the parent/child nesting pattern. It omits what a caller gets back (e.g., whether created IDs are returned) and what happens to the batch if one item fails validation, both of which matter for a 100-item call.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% – key, parent_key, parent, content and the rest are all documented in the schema itself. The sentence 'Give items a `key` and nest later items under them with `parent_key`' describes the hierarchy-building pattern, adding modest value, but largely restates what the per-field schema text already says. Baseline 3 applies.

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 verb and resource with explicit scope: 'Create up to 100 resources in one atomic request.' The batch scope and atomicity distinguish it from the singular create_resource sibling without the agent needing to open either 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?

It gives concrete usage contexts ('scaffolding a region, a cast of NPCs or a whole hierarchy'), which tells the agent when bulk creation is appropriate. It never explicitly names the alternative (create_resource for single items) or states exclusions, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_timeline_eventC

Add an event to a timeline document. Link it to the page that tells the full story.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoDate in the timeline's calendar, as people write it: '1492', 'Mirtul 1492', '3 March 1204', '1204-03-03'. Parsed by LegendKeeper with the document's calendar.
laneNoLane id or name; a new lane is created if the name does not exist.
linkNoResource id/name (or lk:// URI) with the full story.
nameYesShort event name (events have no description).
typeNo'event' or a 'note' annotation.event
colorNo
startNoDate in the timeline's calendar, as people write it: '1492', 'Mirtul 1492', '3 March 1204', '1204-03-03'. Parsed by LegendKeeper with the document's calendar.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
resourceYesResource id, or its exact name/alias (case-insensitive).
is_hiddenNo
icon_glyphNo
end_minutesNo
start_minutesNoExact start in calendar minutes (alternative to `start`).
show_on_calendarNo

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare this is a non-read-only, non-idempotent, non-destructive write. The description adds nothing beyond that profile — no mention of permissions, side effects (e.g., that a missing lane name causes a new lane to be created), or the open-world resource resolution behavior. The 'full story' link sentence is the only behavioral flavor, and it maps to a parameter.

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?

Two short sentences, front-loaded with the action, with no filler. It is efficient but arguably under-specified for a 15-parameter mutation tool, which is a completeness problem rather than a verbosity one.

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

Completeness2/5

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

For a 15-parameter, non-idempotent, open-world creation tool with no output schema, the description is far too thin. It does not explain the two required parameters' roles, the optional link relationship, or what the caller gets back, leaving the agent to rely entirely on the schema.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, so the schema already documents most parameters (start/end calendar formats, lane creation, resource resolution, project/document defaults). The description reinforces only the `link` parameter's intent ('page that tells the full story') and adds nothing for the undocumented color, is_hidden, icon_glyph, end_minutes, and show_on_calendar fields.

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 names a specific verb and resource ('Add an event to a timeline document'), which clearly separates it from update_timeline_event and delete_timeline_event. However, it does not distinguish itself from other creation tools beyond the obvious verb, relying on the noun to carry differentiation.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus alternatives, no preconditions, and no mention of update_timeline_event for modifying an existing event. The only hint ('Link it to the page that tells the full story') describes a parameter rather than tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_timeline_laneB

Add a lane (row) to a timeline, placed after the existing lanes.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
sizeNosm
colorNoColor for every event in the lane.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
resourceYesResource id, or its exact name/alias (case-insensitive).

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare the mutation profile (readOnly=false, destructive=false, idempotent=false, openWorld=true). The description adds a useful ordering fact — the lane is appended after existing lanes — but says nothing about name uniqueness, limits on lane count, or permissions.

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?

A single sentence that front-loads the action and includes the one behavioral detail worth stating. Nothing is wasted.

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

Completeness3/5

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

For a mutation tool with no output schema, the description doesn't say what is returned (e.g., a lane id) or what happens on duplicate names. Adequate but leaves real gaps given 6 parameters and no return documentation.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, and the description adds no parameter meaning beyond the schema (name, size, color, project, document, resource). Baseline 3 is appropriate since the schema does most of the work.

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?

Clear specific verb+resource ('Add a lane (row) to a timeline') with a scope detail (placed after existing lanes). An agent can distinguish it from create_timeline_event, though the description never names that sibling explicitly.

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

Usage Guidelines2/5

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

No guidance on when to create a lane versus a timeline event, no prerequisites, and no alternatives mentioned. The only usage-adjacent information is the placement behavior (appended after existing lanes).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_documentA
DestructiveIdempotent

Delete one document (tab) of a resource. It can be restored with api_request (POST /resources/{id}/docs/{docId}/restore).

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true. Ask the user before deleting.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentYesDocument id or name.
resourceYesResource id, or its exact name/alias (case-insensitive).

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description earns credit for adding reversibility context the annotations cannot express: the deleted document can be restored via POST /resources/{id}/docs/{docId}/restore. It still does not say what downstream references break or whether the operation is immediate.

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?

Two sentences, zero filler, with the scope constraint (one document/tab) front-loaded and the recovery endpoint compactly parenthesized.

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 mutation with no output schema, the description plus annotations cover the essentials: what it deletes, that it is reversible, and how to reverse it, while confirm semantics live in the schema. Minor gap: no statement of permission requirements or side effects on resources referencing the deleted document.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema itself documents all four parameters including the required confirm=true with a user-consent instruction. The description adds no parameter-level detail beyond the schema, so the baseline of 3 applies.

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?

States a specific verb and resource, and immediately narrows scope to "one document (tab) of a resource," which distinguishes it from delete_resource. However, it never names the sibling it is adjacent to (delete_resource, update_document) so the differentiation is implicit rather than explicit.

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

Usage Guidelines3/5

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

The description implies when deletion is appropriate by framing it as a per-document (tab) operation, and it points to a recovery route via api_request restore. It gives no explicit when-not guidance (e.g., use update_document to clear content instead of deleting) and names no alternative tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_map_featureC
DestructiveIdempotent

Delete a feature (pin, label, region, path or folder) from a map.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
resourceYesResource id, or its exact name/alias (case-insensitive).
feature_idYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, openWorldHint=true and readOnlyHint=false, so the safety profile is fully carried by structured data. The description adds no behavioral context of its own—nothing about what gets destroyed, whether deletion is recoverable, or the confirm gate.

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?

A single front-loaded sentence with zero waste that puts the action and target first. It is efficient, though it offers nothing in the way of additional structure or emphasis.

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

Completeness3/5

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

For a destructive 5-parameter delete tool, the description is thin: it never mentions the required confirm flag or the project/document scoping that the schema exposes. Annotations cover safety and there is no output schema, but the definition is only minimally adequate.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already documents resource, project, document, and confirm (including 'Must be true'). The description adds no parameter meaning beyond what the schema provides, so the baseline 3 is appropriate.

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?

States a specific verb ('Delete') and resource ('a feature ... from a map') and enumerates the feature types (pin, label, region, path, folder), which is more precise than the bare name. An agent can identify the action unambiguously, though it doesn't explicitly contrast with siblings like update_map_feature or delete_resource.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives such as update_map_feature, delete_document, or delete_resource. No prerequisites or conditions are mentioned; the agent must infer all routing decisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_resourceA
DestructiveIdempotent

Move a resource (with its documents, and children if cascade=true) to the trash. Restore it with restore_resource using the id returned here.

ParametersJSON Schema
NameRequiredDescriptionDefault
cascadeNoAlso delete all child resources.
confirmNoMust be true. Ask the user before deleting.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
resourceYesResource id, or its exact name/alias (case-insensitive).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely non-redundant behavior: deletion is a move-to-trash (recoverable), cascade=true also removes child resources, and an id is returned for restoration — none of which the annotations convey.

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?

Two short sentences, zero filler, with the scope of the operation (documents, cascade children) front-loaded and the recovery path second. Every clause carries information.

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?

With no output schema, the description usefully tells the agent that the call returns an id consumed by restore_resource, and the annotations plus fully-documented schema cover the remaining safety and parameter needs. Nothing required to invoke it correctly is missing.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (including the mandatory confirm and the project defaulting rule) are already documented. The description restates the cascade effect but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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 ('Move a resource ... to the trash') and clarifies the semantics of the operation — it is a soft delete, not a permanent removal. It also names the inverse sibling (restore_resource), letting an agent distinguish this from delete_document or delete_map_feature 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 Guidelines3/5

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

The description routes the agent to restore_resource for undoing the action and implies reversibility, which is useful context. However, it never states when to prefer delete_resource over the many other delete_* siblings, nor any preconditions beyond what the schema's confirm field already carries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_timeline_eventC
DestructiveIdempotent

Delete an event from a timeline.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
event_idYes
resourceYesResource id, or its exact name/alias (case-insensitive).

TDQS

C2.6/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered structurally. The description adds nothing beyond that: it does not state that the deletion is irreversible, that confirm must be true to proceed, or what happens to associated data.

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?

A single, front-loaded sentence with zero filler. It is efficient, though the brevity shades into under-specification rather than disciplined conciseness.

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

Completeness2/5

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

For a destructive, confirm-gated mutation with no output schema, the description omits the two things an agent most needs: that the action cannot be undone and that the confirm flag must be set to true. The annotations carry the destructiveness hint, but the operational gate is left entirely to the schema.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80% and the schema itself documents project, document, resource, and even the confirm gate ('Must be true.'). The description contributes no parameter meaning, so the baseline 3 applies when the schema does the heavy lifting.

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

Purpose3/5

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

The verb and resource are stated ('Delete an event from a timeline'), so the purpose is not misleading, but the sentence is a near-restatement of the tool name delete_timeline_event and adds no distinguishing detail versus siblings like delete_document, delete_resource, or delete_map_feature.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of prerequisites (e.g., the confirm flag), and no reference to alternatives such as update_timeline_event or deleting the parent lane. The agent must infer everything from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_resourceA
Read-onlyIdempotent

Get one resource's details: path, tags, aliases, icon, banner, documents, sidebar properties (facts) and children. Use read_document to read a document's content.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
resourceYesResource id, or its exact name/alias (case-insensitive).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety is covered. The description adds a real behavioral fact beyond that: the call returns document references/metadata rather than document content, which the agent must fetch separately via read_document. It does not cover error behavior for missing resources, but the annotations lower the bar.

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?

Two sentences with no filler; the return-field enumeration comes first and the sibling routing second. Every clause carries information the agent needs.

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?

There is no output schema, so the description carries the return-value burden, and it does so by enumerating the fields returned. Combined with rich annotations and a fully documented two-parameter schema, nothing essential for correct invocation is missing.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both 'project' (project name, omit for default, see list_projects) and 'resource' (id or exact name/alias, case-insensitive) are fully documented in the schema. The description adds no syntax or lookup guidance for either parameter, so the baseline 3 applies.

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 (get) and resource (one resource's details) and then enumerates exactly what is returned: path, tags, aliases, icon, banner, documents, sidebar facts, and children. It also separates itself from the read_document sibling, so an agent can tell it apart 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 Guidelines4/5

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

The description routes the agent explicitly: use this to fetch resource metadata, and 'Use read_document to read a document's content.' That names an alternative and the condition selecting it, but it does not say when to prefer this over browse_tree or search for locating a resource.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assetsB
Read-onlyIdempotent

List the world's asset library (uploaded images, maps, folders) with ids and URLs. Image URLs can be used in page images, banners, map images and events.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
folder_idNoAsset folder id; omit for the library root.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by disclosing that entries come back with ids and URLs and that URLs are consumable by pages, banners, maps and events. It says nothing about pagination or the 1000-item ceiling implied by the limit parameter.

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?

Two short sentences, front-loaded with the core action and the payload contents. The second sentence is tangent-adjacent but earns its place by telling the agent why the returned URLs matter, sparing it a follow-up lookup.

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

Completeness3/5

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

There is no output schema, so the description is the only source of return-value information; it partially fills that void with 'ids and URLs' but omits pagination, folder nesting, and result ordering. For a read-only listing tool with annotations covering safety, this is adequate but leaves real gaps.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, with project and folder_id documented in the schema (including a list_projects cross-reference) and only limit undocumented. The description adds no parameter meaning of its own and does not clarify limit's default/range behavior, so it hovers at the minimum-viable baseline.

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?

States a specific verb (List) and a precise resource (the world's asset library), and enumerates what that library contains (uploaded images, maps, folders). An agent can tell this apart from create_resource, upload_image, or browse_tree without opening schemas, though no sibling is named explicitly.

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

Usage Guidelines2/5

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

The description never says when to call this instead of search, browse_tree, or list_projects. The closing note that image URLs can be used in pages/banners/maps implies a downstream workflow but gives no selection criteria or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_calendarsA
Read-onlyIdempotent

List the calendars timelines can use (built-in ones like gregorian, harptos, exandria, plus custom calendars): id, name, months and eras.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is fully covered without the description. The description adds no further behavioral context such as auth/permission needs, scoping by project, or whether custom calendars are user-created. It does hint at the returned content, which is mildly useful.

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?

A single sentence with a front-loaded verb-resource phrase and the return fields appended; every clause carries information and nothing is redundant.

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?

With no output schema, the description helpfully discloses the returned fields (id, name, months, eras), which is the main gap it needs to fill. Annotations cover safety, and the sole parameter is covered by the schema. Only the lack of any guidance on when to call it versus other list_* tools keeps it from a 5.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the single optional `project` parameter is documented in the schema, including the cross-reference to list_projects. The description adds nothing about the parameter, so the baseline 3 applies.

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?

States a specific verb and resource ("List the calendars timelines can use") and enumerates the domain with concrete examples (gregorian, harptos, exandria, plus custom). It also names the returned fields. It does not explicitly route against a sibling (e.g. list_projects or get_resource), but the resource 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 Guidelines3/5

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

The phrase "calendars timelines can use" implies this is a prerequisite lookup before creating timeline events or lanes, but there is no explicit when-to-use statement, no preconditions, and no named alternative. Usage must be inferred from the sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_membersA
Read-onlyIdempotent

List the members of the world and their roles (emails are only visible to ADMIN keys).

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already establish the safe-read profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower, and the description adds genuine context beyond them: email fields are conditionally redacted based on ADMIN key privileges. That conditional-disclosure detail is exactly the kind of non-obvious behavior an agent needs before promising a caller email data.

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?

A single sentence with the core action front-loaded and the privilege caveat tucked into a parenthetical. Nothing is wasted and nothing important is 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 one-optional-parameter read tool with no output schema, the description covers what is returned (members and roles) and the one surprising behavior (email redaction). It stops short of noting pagination or result-size behavior, but nothing essential to calling it correctly is missing.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and the schema documents it fully at 100% coverage (including the 'omit to use default; see list_projects' hint). The description adds nothing about the project argument, so the baseline 3 for schema-carried semantics applies.

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?

States a specific verb and resource ('List the members of the world') plus what is returned ('their roles'), so the agent knows exactly what this does. No sibling is a plausible substitute (the other list_* tools cover projects, tags, templates, calendars, assets), but the description never names that distinction explicitly.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus alternatives, and no prerequisites for the caller. The ADMIN-key note is about data visibility rather than invocation guidance, so the agent must infer the use case from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsA
Read-onlyIdempotent

List the LegendKeeper projects (worlds) this server is configured for, with the default project and whether writes are enabled. Each API key belongs to exactly one project.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real context beyond that: it discloses the shape of the response (default project, write-enabled flag) and the tenancy constraint that each API key maps to exactly one project - information an agent needs when reasoning about writes elsewhere.

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?

Two sentences, zero filler, with the core resource identified in the first clause and the scoping/tenancy fact placed last as supporting context. Nothing repeats the tool name as a tautology.

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?

With no parameters, no output schema, and annotations covering safety, the description is nearly self-sufficient because it explicitly states what is returned (configured projects, default project, write-enabled status). Only a note on how project identity is used by subsequent tools would make it fully complete for an orientation call.

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 tool takes zero parameters, so the baseline is 4. There is nothing parameter-related the description could usefully add, and it correctly adds none.

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 ('List the LegendKeeper projects (worlds)') and immediately scopes it to 'this server is configured for', plus clarifies the parenthetical synonym 'worlds'. No sibling does anything comparable (the other list_* tools enumerate tags, templates, calendars, members, assets), so an agent can identify it unambiguously.

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

Usage Guidelines3/5

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

The mention of 'the default project and whether writes are enabled' implies this is an orientation/discovery call, but there is no explicit when-to-use statement such as 'call this before any write tool to learn which project an API key targets'. Usage must be inferred from the returned-content hint rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsA
Read-onlyIdempotent

List every tag used in the world with how many resources carry it. Check this before tagging so you reuse existing tags with the exact same spelling.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds value beyond that by disclosing the return content (each tag plus its resource count) and the recommended workflow position (pre-tagging lookup), though it does not discuss pagination or scale limits on the listing.

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?

Two sentences, zero waste. The capability statement is front-loaded and the usage guidance follows immediately; every clause earns its place.

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?

No output schema exists, but the description communicates what is returned (tag names with usage counts), which is the key missing piece. Project scoping is handled by the schema, so the definition is nearly complete; only pagination or result-size behavior is unaddressed.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single 'project' parameter is fully documented in the schema, including the default behavior and a pointer to list_projects. The description adds nothing about the parameter, so the baseline 3 applies.

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 ('List every tag') plus the exact payload ('with how many resources carry it') and the scope ('in the world'). No sibling tool deals with tags, so there is no ambiguity to resolve, and the agent knows precisely what it will get back.

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?

Explicitly states the condition for calling it: 'Check this before tagging so you reuse existing tags with the exact same spelling.' It both tells the agent when to use it and why (avoiding duplicate/typo'd tags), leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_templatesA
Read-onlyIdempotent

List resource templates (id, name, parent). Use create_from_template to instantiate one.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. With no output schema, the description's listing of returned fields (id, name, parent) adds genuine value, but it says nothing about scoping, ordering, or whether templates come from a fixed catalog vs the project.

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?

Two sentences, zero waste. The core action and returned fields are front-loaded and the related tool is named second.

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 simple no-required-param read tool, the description plus annotations plus the fully documented schema cover everything necessary to invoke it. It could note how many templates are expected or whether the project argument filters the listing, but nothing critical is missing.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% – the single 'project' parameter is fully documented, including its default and a cross-reference to list_projects. The description contributes no additional parameter meaning, which is the expected baseline when the schema does the work.

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 gives a specific verb and resource ('List resource templates') and even names the returned fields (id, name, parent), so the agent knows exactly what comes back. It partially differentiates from create_from_template by framing that tool as the instantiation step, but it doesn't distinguish itself from other list_* siblings.

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

Usage Guidelines3/5

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

The second sentence points to create_from_template as the follow-on action, which implies the tool's role in a workflow. However, it offers no when-to-use/when-not guidance relative to siblings like browse_tree or get_resource, and no prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_resourceA
Idempotent

Move a resource (and its children) to another parent and/or position among its siblings.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoPlace after this sibling (id or name).
beforeNoPlace before this sibling (id or name).
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
resourceYesResource id, or its exact name/alias (case-insensitive).
new_parentNoNew parent id or name, or 'root' for the top level. Omit to keep the parent.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so much of the safety profile is covered. The description still adds real value beyond them by disclosing that children move with the resource and that the operation can be a pure reorder, which tells the agent about the cascading effect of the call.

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?

A single front-loaded sentence naming the action, target, and the two things it changes. Every clause earns its place, and the parenthetical about children is the most important detail delivered inline.

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 five-parameter mutation tool with fully documented schema and annotations covering safety and idempotency, the description supplies what structured fields cannot: the subtree cascade and the reorder capability. Minor gaps remain (behavior when 'before' and 'after' conflict, ordering relative to a new parent), but nothing essential is missing for correct invocation.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so 'new_parent', 'before'/'after', and 'project' are all documented in the schema itself. The description's phrase 'to another parent and/or position among its siblings' usefully frames how those parameters combine (parent optional, position optional), but adds no syntax or format detail beyond the schema, so the baseline 3 is right.

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?

States a specific verb ('Move') and resource, plus the two distinct effects: reparenting and sibling reordering. It implicitly separates itself from update_resource by focusing on location rather than content, but it never names an alternative, so sibling differentiation is only inferred.

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

Usage Guidelines3/5

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

Usage is implied by the description ('move ... to another parent and/or position'), but there is no explicit when-to-use guidance and no statement of when to prefer this over update_resource, which a reader might assume could also change parents. Callers must infer the boundary themselves.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_documentA
Read-onlyIdempotent

Read a document of a resource. Pages come back as Markdown (with mentions as Name links); maps list their pins/regions/paths with coordinates; timelines list lanes and events; boards list their text. Without document, the first page is used, else the first map, timeline or board.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNomarkdown (default, editable), text (plain text) or json (raw API data).markdown
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
resourceYesResource id, or its exact name/alias (case-insensitive).
opaque_blocksNoHow page blocks Markdown cannot express are shown: 'keep' = readable summary between lk:keep markers (preserved on write), 'json' = editable ```lk-block JSON fences.keep

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is covered. With no output schema, the description earns credit by describing the actual return shape per document type (Markdown pages with lk:// links, map coordinates, timeline lanes, board text), which the agent could not otherwise anticipate.

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?

Three information-dense sentences with the core purpose front-loaded and no filler. The semicolon-separated enumeration of per-type outputs is efficient, though slightly list-heavy for the 10% weight.

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 read-only tool whose annotations cover the safety profile, the description supplies the one thing structured fields lack: what content is returned for each document type. Missing only error/edge behavior (e.g., resource not found, empty document) and the format/opaque_blocks interplay, which keeps it short of a 5.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented, making 3 the baseline. The description adds only marginal value beyond the schema, mainly reinforcing the omitted-'document' fallback chain that the schema already states as 'Omit to pick the resource's main document.'

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 opens with a specific verb and resource: 'Read a document of a resource,' then enumerates what each document type returns (pages as Markdown, maps as pins/regions/paths, timelines as lanes/events, boards as text). It clearly separates this from write_page/create_document siblings, though it never explicitly contrasts with get_resource or browse_tree, which also fetch content.

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

Usage Guidelines3/5

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

It documents the fallback behavior when 'document' is omitted ('the first page is used, else the first map, timeline or board'), which is useful selection context. However, there is no guidance on when to use read_document versus get_resource, browse_tree, or search, and no exclusions or prerequisites are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_resourceA
Idempotent

Restore a deleted resource from the trash (its parent must not be deleted).

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
resource_idYesId of the deleted resource.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=false, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds a genuine behavioral precondition not present in structured data: the parent resource must not itself be deleted for the restore to be valid. It stops short of describing failure behavior or permission requirements.

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?

A single front-loaded sentence with the core action first and the precondition second. No filler, no redundancy.

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 low-complexity two-parameter mutation with full schema coverage and annotations covering safety and idempotency, the description supplies the one non-obvious constraint. It lacks any mention of return values or how partial/precondition failure surfaces, but no output schema exists and nothing essential to invocation is missing.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (project and resource_id) are already documented, including the "Omit to use the default project" guidance. The description adds no format or syntax detail beyond what the schema provides, making the baseline 3 correct.

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?

States a precise verb and resource ("Restore a deleted resource from the trash") plus the scope constraint. No sibling offers restore semantics, so the operation is unambiguous, though it does not explicitly contrast itself with siblings like delete_resource or update_resource.

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

Usage Guidelines3/5

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

Usage is implied by the word "restore" — it applies to previously deleted resources — and a precondition is given (parent must not be deleted). However, there is no explicit when-to-use guidance, no statement of what to do instead if the parent is deleted, and no reference to any alternative tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_factsB
Idempotent

Set at-a-glance facts (e.g. Race, Age, Ruler, Population) as key-value rows in the page's infobox or the resource's sidebar. Creates the infobox / property group when it does not exist yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
factsYesFact name -> value. Values accept inline Markdown and [[Name]] links. Use null to remove a fact. Existing facts with the same name (case-insensitive) are updated in place.
titleNoTitle of the key-value group (default: the first one, or 'Facts' when creating).
targetNoinfobox: the box at the top of the page (created if missing). sidebar: properties.infobox
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
resourceYesResource id, or its exact name/alias (case-insensitive).

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already cover the safety profile: not read-only, idempotent, non-destructive, and open-world. The description adds useful behavioral context by stating that it creates the infobox or property group when it does not exist yet, but it omits permissions, side effects beyond creation, and removal behavior noted only in the schema.

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?

Two tight sentences with no filler. The core action and location are front-loaded, followed immediately by the creation behavior.

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?

With a rich six-parameter schema, nested facts object, and annotations covering mutation safety, the description is largely complete for calling the tool. It could be stronger with usage guidance or explicit side-effect expectations, but no output schema exists and return values need not be explained.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters, including fact name/value semantics, null removal, case-insensitive updates, and target options. The description's examples slightly enrich understanding of facts but do not add parameter-level meaning beyond the schema.

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 specific verb ('Set'), resource ('facts'), and location ('infobox or resource sidebar'), with examples like Race, Age, Ruler, and Population. It is clearly not a generic page-writing tool, but it does not explicitly differentiate itself from siblings such as write_page or update_document.

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

Usage Guidelines2/5

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

The description gives no explicit when-to-use guidance or alternatives. It explains what the tool does and that it creates the infobox/property group when missing, but an agent gets no instruction on when to prefer this over write_page, update_document, or other sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_documentB
Idempotent

Rename a document, hide/show it, toggle full width, set a timeline's calendar or a map's image.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentYesDocument id or name.
resourceYesResource id, or its exact name/alias (case-insensitive).
is_hiddenNo
calendar_idNoTimeline calendar id.
is_full_widthNo
map_image_asset_idNoImage asset id to set as the map image.

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the mutation and idempotency profile is covered. The description adds little beyond that: it does not state whether omitted/nullable fields are left unchanged (partial vs full update), nor any auth or return behavior. Baseline 3 is appropriate.

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?

A single front-loaded sentence with the primary verb first and no filler. It is dense but every clause maps to a capability; the trailing 'set a timeline's calendar or a map's image' is slightly run-on but still compact and useful.

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

Completeness3/5

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

For a mutating tool with an annotations safety profile and no output schema, the main missing element is partial-update semantics: since most fields are nullable with null defaults, an agent cannot tell whether passing null clears or preserves a value. Safety and return-format gaps are covered by annotations and the absence of an output schema, but the update semantics gap is a real one.

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?

With schema description coverage at 63%, the description compensates well by mapping natural-language actions onto the terse parameters: rename→name, hide/show→is_hidden, full width→is_full_width, timeline calendar→calendar_id, map image→map_image_asset_id. The remaining params (document, resource, project) are already documented in the schema, so the description adds genuine meaning.

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 specific verb+resource combination (updates to a document) and enumerates the exact mutable facets: rename, hidden state, full width, timeline calendar, map image. It implicitly distinguishes from create_document/read_document/delete_document, though the phrasing 'a timeline's calendar or a map's image' slightly blurs whether it edits a timeline/map or the document's properties.

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

Usage Guidelines2/5

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

The description lists what can be changed but gives no when-to-use guidance, no alternatives, and no exclusions. There is no hint about when to prefer this over update_resource, update_timeline_event, update_map_feature, or update_timeline_lane, nor any prerequisite information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_map_featureC
Idempotent

Change a map feature: rename, move, reshape, relink, restyle or hide it.

ParametersJSON Schema
NameRequiredDescriptionDefault
linkNoResource id/name or lk:// URI.
nameNo
colorNo
extraNoOther updateFeature fields.
pointsNo
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
positionNo
resourceYesResource id, or its exact name/alias (case-insensitive).
is_hiddenNo
feature_idYes
icon_colorNo
icon_glyphNo
icon_shapeNo
pixel_coordinatesNo

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true and openWorldHint=true, so safety and idempotency are covered. The description adds nothing beyond that: it never says whether omitted parameters leave fields untouched or whether passing null clears them, nor how errors or non-existent feature_ids are surfaced. For a 15-parameter mutation tool this leaves real behavioral questions unanswered.

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?

One compact sentence, front-loaded with the verb and resource, and the operation list is terse. No filler, no repetition of the tool name.

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

Completeness2/5

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

A single short sentence is inadequate for a 15-parameter mutation tool with 33% schema coverage, no output schema, and several undocumented fields (feature_id, pixel_coordinates, extra, project, document) plus the unresolved position-vs-points distinction. Critical semantics such as partial-update behavior and pixel vs geographic coordinate modes are simply absent.

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

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33% across 15 parameters, so the description is expected to compensate and must map operations to fields. It is not an operation list; it is a single sentence naming no parameter, so it contributes nothing that the schema does not.

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?

Specific verb ('Change') plus resource ('map feature'), with an enumeration of the six operation families (rename, move, reshape, relink, restyle, hide). This lets an agent distinguish it from create_map_feature / delete_map_feature even though those siblings are not named. It stops short of a 5 only because sibling differentiation is left implicit.

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

Usage Guidelines3/5

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

Usage is implied by the verb list: the agent can infer this is the tool for modifying an existing feature rather than creating or deleting one. But there is no explicit when-to-use statement, no when-not-to-use, and no mention of prerequisites (e.g. that the feature must already exist, or that you need its feature_id from browse_tree/search).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_resourceA
Idempotent

Change a resource's name, tags, aliases, icon, visibility, lock or banner. Content is edited with write_page; facts with set_facts; position in the tree with move_resource.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
tagsNoReplace all tags with this list.
aliasesNoReplace all aliases.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
add_tagsNoTags to add (kept if already present).
resourceYesResource id, or its exact name/alias (case-insensitive).
is_hiddenNoHide/show (ADMIN keys only).
is_lockedNo
banner_urlNoBanner image URL (must be an uploaded asset URL, see upload_image).
icon_colorNo
icon_glyphNoFont Awesome icon name.
icon_shapeNo
add_aliasesNo
remove_tagsNoTags to remove.
banner_enabledNo
banner_y_positionNoBanner focus, 0-100.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare non-read-only, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds a useful scope boundary (this tool does not touch content, facts, or tree position), but for a 16-parameter partial-update mutation it never states whether omitted fields are left unchanged, what happens on conflicting tag params, or the admin requirement for visibility.

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?

Two sentences, zero filler: the capability is front-loaded and the routing alternatives follow immediately. Nothing could be removed without losing routing information.

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

Completeness3/5

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

For a 16-param mutation with 1 required param, no output schema and only 63% schema coverage, the definition is adequate but leaves real gaps: partial-update semantics and the interaction between tags/tags+add_tags/remove_tags are unaddressed. Annotations do carry the safety profile, so the omission is not fatal.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 63%, above the baseline threshold, and the schema already documents replace semantics for tags/aliases and the add/remove variants. The description's value is mostly vocabulary mapping (icon -> glyph/color/shape, visibility -> is_hidden, lock -> is_locked), with no added meaning for the replace-vs-add/remove distinction or the unmentioned project parameter.

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 (Change) plus the exact resource and enumerates the mutable attribute set (name, tags, aliases, icon, visibility, lock, banner). It also names three siblings it is not (write_page, set_facts, move_resource), so an agent can separate it from the adjacent update tools 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 Guidelines5/5

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

Provides an explicit routing map: content edits go to write_page, facts to set_facts, tree position to move_resource, everything else to this tool. That is exactly the when-to-use-something-else guidance the dimension asks for, delivered compactly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_timeline_eventC
Idempotent

Change a timeline event's name, dates, lane, link or style.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoDate in the timeline's calendar, as people write it: '1492', 'Mirtul 1492', '3 March 1204', '1204-03-03'. Parsed by LegendKeeper with the document's calendar.
laneNoMove to this lane (id or existing name).
linkNo
nameNo
colorNo
startNoDate in the timeline's calendar, as people write it: '1492', 'Mirtul 1492', '3 March 1204', '1204-03-03'. Parsed by LegendKeeper with the document's calendar.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
event_idYes
resourceYesResource id, or its exact name/alias (case-insensitive).
is_hiddenNo
icon_glyphNo
end_minutesNo
start_minutesNo
show_on_calendarNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true and openWorldHint=true, so the safety/idempotency profile is covered. The description adds only the partial list of updatable fields and says nothing about partial-update semantics or behavior when event_id/resource is not found.

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?

A single front-loaded sentence with no filler; the scope is stated immediately. It is appropriately tight, though its brevity borders on under-specification for a 15-param tool.

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

Completeness2/5

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

For a 15-parameter mutation tool with no output schema and 40% parameter coverage, the description is too thin: it omits update semantics, most mutable fields, and return behavior. It does not give the agent enough to call the tool confidently.

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

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 15 parameters and only 40% schema description coverage, the description must carry weight, but it enumerates barely half the mutable fields (name, dates, lane, link, style) and is silent on is_hidden, show_on_calendar, icon_glyph, start/end minutes, project, and document. It does not compensate for the coverage gap.

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?

States a specific verb ('Change') and resource ('a timeline event'), and names the fields it touches, so an agent can tell it apart from create_timeline_event and delete_timeline_event. It is clear but does not explicitly differentiate itself from those siblings in prose.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus create_timeline_event, delete_timeline_event, or the lane tools, and no mention of prerequisites (e.g., that the event must already exist). Usage is only implied by the verb.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_imageA

Upload an image to the world's asset library and return its asset id and URL. Use the URL in a page image (alt), a resource banner (update_resource banner_url) or as a map image (create_document / update_document map_image_asset_id).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoAsset name (default: file name).
sourceYesLocal file path (as seen by this server) or an http(s) URL of a JPEG/PNG/GIF/WebP.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
folder_idNoAsset folder id (see list_assets).
descriptionNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already disclose the operational profile (readOnly=false, openWorld=true, idempotent=false, destructive=false). The description adds the return contract (asset id + URL), which is useful, but it does not warn that non-idempotency means repeat uploads create duplicate assets, nor mention permissions or size/rate limits.

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?

Two sentences, zero filler, and the core action is front-loaded before the integration details. Every clause carries information an agent needs.

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?

With no output schema, the description steps in by naming the returned fields (asset id and URL), and the schema covers accepted formats. Minor gaps remain around failure modes and duplicate handling, but the essentials for calling correctly are present.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already documents name, source, project, and folder_id. The description contributes nothing beyond that for parameters (it only mentions the URL output), so the baseline 3 applies.

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+resource ('Upload an image to the world's asset library') and states the return value ('asset id and URL'). No sibling tool performs uploads, so the distinction from list_assets/create_resource etc. is implicit but clear from the verb.

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?

It gives concrete downstream usage context: the returned URL goes into a page image, a resource banner_url, or a map_image_asset_id. This tells the agent what the tool feeds into, but it does not state when *not* to use it or name an alternative upload path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_pageA

Write Markdown to a page document. [[Name]] and text become mentions; callouts, secrets, tables, task lists and images are supported. Writes are atomic; pass expected_version (from read_document) so edits made in the app after you read the page are never overwritten.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesappend/prepend: add to the end/start. replace: replace the whole page (keep lk:keep markers to preserve special blocks). replace_section: replace the content under the heading `section` (include the heading in `markdown` to rename it). append_to_section: add to the end of that section. A missing section is created at the end of the page.
projectNoConfigured project (world) name. Omit to use the default project; see list_projects.
sectionNoHeading text for the *_section modes (case-insensitive).
documentNoDocument id or name within the resource. Omit to pick the resource's main document.
markdownYesPage content in LegendKeeper Markdown (see legendkeeper://guides/markdown).
resourceYesResource id, or its exact name/alias (case-insensitive).
expected_versionNoThe page version shown by read_document. When set, nothing is written if the page changed since then. Strongly recommended with mode='replace' or 'replace_section'.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare a non-readonly, non-destructive, non-idempotent, open-world write; the description goes beyond them by disclosing atomicity and the optimistic-concurrency safeguard against overwriting app-side edits. It stops short of describing what is returned or how failures surface.

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-loaded with the action, then content semantics, then the safety guarantee. Every sentence carries information an agent needs before calling.

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 7-parameter mutation tool with no output schema, the description covers content format, concurrency safety, and mode semantics delegated to a well-documented schema. Missing only return-value information and explicit sibling differentiation.

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 for the markdown parameter by explaining mention/link syntax resolution and supported block types (callouts, secrets, tables, task lists, images). The expected_version rationale is also clarified even though the schema already touches it.

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?

States a concrete verb+resource ('Write Markdown to a page document') and enumerates the Markdown features handled, so the agent knows exactly what content form is accepted. It does not, however, distinguish itself from the sibling update_document, which an agent might plausibly confuse it with.

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 clear operational guidance: pass expected_version (from read_document) so concurrent edits are not overwritten, and the schema elaborates mode-specific behavior. There is no explicit 'use this instead of X' routing against the sibling update_document tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 31 tool updatesv0.1.2
    • First observedapi_request
    • First observedbrowse_tree
    • First observedcreate_document
    • First observedcreate_from_template
    • First observedcreate_map_feature
    • First observedcreate_resource
    • First observedcreate_resources
    • First observedcreate_timeline_event
    • First observedcreate_timeline_lane
    • First observeddelete_document
    • First observeddelete_map_feature
    • First observeddelete_resource
    • First observeddelete_timeline_event
    • First observedget_resource
    • First observedlist_assets
    • First observedlist_calendars
    • First observedlist_members
    • First observedlist_projects
    • First observedlist_tags
    • First observedlist_templates
    • First observedmove_resource
    • First observedread_document
    • First observedrestore_resource
    • First observedsearch
    • First observedset_facts
    • First observedupdate_document
    • First observedupdate_map_feature
    • First observedupdate_resource
    • First observedupdate_timeline_event
    • First observedupload_image
    • First observedwrite_page

TDQS

B3.4/5.0

Scored across 31 tools

Disambiguation4/5

Most tools target a distinct resource+action (resources, documents, map features, timeline events each have their own verbs). A few pairs could be confused at a glance — create_resource vs create_resources vs create_from_template, and get_resource vs read_document (metadata vs content) — but the descriptions clearly delineate them.

Naming Consistency4/5

Strong verb_noun snake_case pattern dominates (list_projects, create_resource, update_map_feature, delete_timeline_event). Minor deviations are 'search' (bare verb, no noun) and 'api_request' (noun_verb ordering), but overall the convention is predictable.

Tool Count3/5

31 tools is on the heavy side, but the domain is genuinely broad — wiki resources, documents (pages/maps/timelines/boards), assets, tags, calendars and members. The count is defensible for that surface, though some document/map/timeline CRUD could arguably be folded together.

Completeness5/5

Near-complete lifecycle coverage: full CRUD plus trash/restore for resources, documents, map features and timeline events, plus search, tree browsing, tags, templates, facts, and asset upload. The api_request escape hatch explicitly covers remaining gaps (boards, calendars, invites, block edits).

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers