Skip to main content
Glama

The wiki that writes itself — from the code you already ship.

Sign up free   Tour the site   Self-host it

Home · Pricing · Compare · MCP for agents · Docs

License: AGPL-3.0 GitHub stars Latest release Docker npm tela-mcp

tela is a self-hostable, markdown-native team wiki built for a world where agents are first-class authors and readers. It pairs a Go + PostgreSQL backend with a React 19 / Milkdown editor, live Yjs collaboration, ranked full-text and semantic search, and a built-in Model Context Protocol (MCP) server — so the same knowledge base your team edits in the browser is one your agents can search, read, and write directly. Atlas, its documentation engine, turns the artifacts you already produce into maintained wiki pages. Your content stays canonical markdown forever — pages.body is markdown, there is no proprietary block store.

👉 Start at telawiki.com — the marketing site walks through what tela does (with pricing, a comparison, and the agent/MCP story), and the hosted instance has a free tier: no install, no card.

Why tela

  • Atlas auto-doc-gen — point Atlas at your sources and it drafts and maintains real wiki pages, so docs track what you ship instead of rotting.

  • Built-in MCP server — /api/mcp is part of the backend, not a bolt-on. Claude, Cursor, and other agents search, read, and author pages with scoped, per-tool write permissions.

  • Semantic + full-text search — ranked PostgreSQL FTS works out of the box; add an embedder for pgvector-backed semantic retrieval and grounded "ask your docs" answers.

  • Live collaboration — real-time multi-cursor editing over Yjs in a Milkdown editor, with comments, backlinks, and revision history.

  • Teams that run themselves — users create orgs and invite teammates by email, no admin ticket. Flip a space to public and it becomes a login-free blog surface with per-author home pages.

  • Self-host & own your markdown — pages.body is canonical markdown forever (no block table). Sync over WebDAV, export to zip/PDF, and run the whole stack with one make up.

Related MCP server: basic-memory

Quickstart

You need Docker (with Compose) and make. The bundled stack builds every image via Compose, so no host Node or Go toolchain is required.

git clone https://github.com/zcag/tela.git
cd tela

# 1. Write deploy/.env from the example with strong generated secrets
#    (fills TELA_API_KEY_SECRET, TELA_SHARE_SECRET, TELA_PG_PASSWORD via openssl rand)
make setup

# 2. Edit deploy/.env — set TELA_PUBLIC_BASE_URL, and optionally
#    TELA_ADMIN_* and TELA_SMTP_* (see Configuration below)

# 3. Build and start the full stack
make up

The stack comes up behind Caddy on http://localhost:8780. On first boot tela runs its embedded migrations automatically and lands you on the /setup wizard to create the first admin — unless you set TELA_ADMIN_PASSWORD in deploy/.env, which bootstraps the admin non-interactively.

One-click cloud deploy

Prefer managed hosting over running Compose? Deploy the published multi-arch images straight to a platform:

Deploy to Render   Deploy to DigitalOcean

After the first deploy, enable pgvector on the managed database once — CREATE EXTENSION IF NOT EXISTS vector; — then point the backend's TELA_PUBLIC_BASE_URL at your app's public URL. Or skip ops entirely with the free cloud tier.

Common targets:

make up         # build + start the stack on :8780 (auto-stamps git version/commit)
make down       # stop the stack
make logs       # tail logs from all services
make backup     # dump Postgres to ./backups/tela-<timestamp>.sql
make restore FILE=backups/tela-....sql
make clean FORCE=1   # stop and DELETE all volumes (destroys data)

make up is the same thing as running Compose directly — under the hood it's docker compose -f deploy/docker-compose.yml up -d --build (plus a forced proxy recreate so a changed Caddyfile re-mounts). The three load-bearing secrets must be set and stable across deploys: rotating TELA_SHARE_SECRET invalidates outstanding share cookies, and rotating TELA_API_KEY_SECRET invalidates every existing personal access token (PAT).

For full setup, TLS, backups, and upgrades see docs/self-hosting.md and the operations runbook docs/operations.md.

Local development

make dev        # backend (:8080) + frontend (:5173, proxies /api → :8080); boots a local dev Postgres
make be-dev     # backend only (go run; boots the dev Postgres on :55433)
make fe-dev     # frontend only (vite)
make test       # backend tests against a throwaway Postgres
make storybook  # component dev surface

If :8080 is taken on your box, run make dev DEV_BE_PORT=18080 so the backend and the vite /api proxy stay consistent.

Optional: semantic search out of the box

The bundled Compose stack ships an optional Ollama embedder behind a profile. Full-text search always works; this only lights up the semantic half:

docker compose -f deploy/docker-compose.yml --profile embed up -d
docker compose -f deploy/docker-compose.yml exec ollama ollama pull qwen3-embedding:0.6b
# then set TELA_RAG_EMBED_URL=http://ollama:11434 in deploy/.env and restart

Configuration

All configuration is environment-driven via deploy/.env (copy from deploy/.env.example). In the bundled Compose stack TELA_DATABASE_URL is auto-constructed from the TELA_PG_* vars — you only set it explicitly when running the backend against an external Postgres.

Required

Variable

Description

TELA_PUBLIC_BASE_URL

Public origin of the instance (e.g. https://wiki.example.com). Used in emails, share links, and OAuth audiences.

TELA_SHARE_SECRET

Secret signing share-link password cookies. Generate with openssl rand -hex 32; never rotate (invalidates outstanding share cookies).

TELA_API_KEY_SECRET

Secret signing personal access tokens (PATs). Generate with openssl rand -hex 32; never rotate (invalidates every existing PAT).

TELA_PG_PASSWORD

Password for the bundled Postgres. No default — must be set.

Postgres

Variable

Description

TELA_PG_USER

Postgres role for the bundled DB. Default tela.

TELA_PG_DB

Postgres database name. Default tela.

TELA_DATABASE_URL

Full DSN — only set when running outside the bundled stack (external/managed Postgres). Format postgres://USER:PASS@HOST:5432/DB?sslmode=disable.

Bootstrap admin (optional)

Variable

Description

TELA_ADMIN_USERNAME

Bootstrap admin username (first boot only).

TELA_ADMIN_PASSWORD

Bootstrap admin password. Unset → use the /setup web wizard instead.

TELA_ADMIN_EMAIL

Optional; pre-confirms the admin's email so it's exempt from the confirmation gate. Setting it later backfills the existing admin.

Email (transactional + notifications)

With TELA_SMTP_HOST unset, tela logs confirmation/reset/notification links to stdout instead of sending (fine for dev / first boot). Works with any SMTP relay.

Variable

Description

TELA_SMTP_HOST

SMTP relay host (e.g. smtp.resend.com).

TELA_SMTP_PORT

587 starttls (default) or 465 ssl.

TELA_SMTP_TLS

starttls | ssl | none.

TELA_SMTP_USERNAME

SMTP username.

TELA_SMTP_PASSWORD

SMTP password or API key.

TELA_SMTP_FROM

From identity, e.g. tela <tela@example.com>.

Custom domains & TLS (optional)

Variable

Description

TELA_SITE_ADDRESS

Canonical host Caddy binds for direct-TLS mode (e.g. telawiki.com). Empty → :80 (terminator/CF mode), which disables org custom domains.

TELA_CUSTOM_DOMAIN_TARGET

Shared CNAME target shown to org admins adding a hostname. Defaults to the canonical host.

AI: semantic retrieval, ask-your-docs, Atlas (all optional, ship dark)

These features ship dark — unset means the relevant endpoints return 503 and nothing is computed. Point them at your own Ollama / OpenAI-compatible endpoints, the bundled --profile embed Ollama, or tela cloud's managed endpoints (authenticated with a telawiki.com PAT).

Variable

Description

TELA_RAG_EMBED_URL

Embedder endpoint for semantic chunk search (e.g. http://ollama:11434). Unset → /api/rag/* 503.

TELA_RAG_EMBED_MODEL

Embedding model. Must be 1024-d; default qwen3-embedding:0.6b.

TELA_RAG_EMBED_DIM

Advisory embedding dimension (the column is fixed at vector(1024)).

TELA_RAG_EMBED_TOKEN

Bearer token for a managed/authenticated embed endpoint.

TELA_RAG_QUERY_INSTRUCT

Query-side instruction prefix for asymmetric retrieval. Unset → sensible default.

TELA_RAG_RERANK_URL

Optional cross-encoder reranker /rerank endpoint (Cohere/Jina/TEI-compatible).

TELA_RAG_RERANK_MODEL / TELA_RAG_RERANK_TOKEN

Reranker model name and token.

TELA_RAG_LOG_ASKS

Log "ask your docs" questions to surface knowledge gaps (admin-only). 0 disables.

TELA_LLM_URL

OpenAI-compatible chat base including /v1 for grounded answers (/api/rag/ask). Unset → 503.

TELA_LLM_MODEL

Chat model name (e.g. qwen2.5:7b).

TELA_LLM_TOKEN

Bearer token for a managed/authenticated LLM endpoint.

TELA_LLM_MAX_TOKENS

Completion length cap. Default 1024; 0/-1 disables the cap.

TELA_AGREEMENT

Epistemic trust pass (corroborate/contradict scoring). On when LLM+embedder are set; 0 disables.

TELA_ATLAS_MAX_CONCURRENT_RUNS

Cap on concurrent Atlas doc-gen runs. Default 1.

ATLAS_LLM_CONCURRENCY

Per-run client concurrency gate. Default 6.

TELA_ATLAS_WORKDIR

Where Atlas unpacks working files. Default: OS temp dir.

TELA_IMAGE_GEN_URL / TELA_IMAGE_GEN_MODEL / TELA_IMAGE_GEN_KEY

OpenAI-compatible Images endpoint for the MCP generate_deck_image tool. Unset → 503.

Auth: MCP OAuth & federated sign-in (optional)

Variable

Description

TELA_WORKOS_ISSUER

WorkOS AuthKit issuer to enable Claude.ai/ChatGPT "Connect" OAuth on /api/mcp. Unset → MCP stays PAT-only.

TELA_MCP_RESOURCE

The MCP endpoint's public URL (OAuth audience). Defaults to {TELA_PUBLIC_BASE_URL}/api/mcp.

WORKOS_API_KEY

Server-side WorkOS secret for the Standalone login bridge.

TELA_SSO_GOOGLE_CLIENT_ID / _SECRET

Google OIDC sign-in. Dark until both are set.

TELA_SSO_MICROSOFT_CLIENT_ID / _SECRET

Microsoft OIDC sign-in. Dark until both are set.

TELA_SSO_GITHUB_CLIENT_ID / _SECRET

GitHub OAuth2 sign-in. Dark until both are set.

Billing (optional, ships dark)

Variable

Description

TELA_POLAR_TOKEN

Polar organization access token. Unset → checkout/portal 503; plans stay operator-assigned.

TELA_POLAR_WEBHOOK_SECRET

Polar webhook signing secret (verbatim).

TELA_POLAR_BASE_URL

https://api.polar.sh or https://sandbox-api.polar.sh.

TELA_POLAR_PRODUCTS

Maps plan keys to Polar product UUIDs, e.g. personal_plus:<uuid>,org_team:<uuid>.

Services, sync & ops (optional)

Variable

Description

TELA_GOTENBERG_URL

PDF render engine. Default http://gotenberg:3000.

TELA_PDF_RENDER_BASE_URL

Internal origin Gotenberg's Chromium loads the reader from. Default http://proxy.

TELA_DECK_URL

Slidev deck render sidecar. Default http://deck:3344.

TELA_WEBDAV_ENABLED

WebDAV sync surface (/dav/). Default on; 0/false disables.

TELA_WEBDAV_CREATE_SPACES

Allow root-level MKCOL to mint spaces. Default on (any write-scoped PAT can create spaces via WebDAV).

TELA_WEBDAV_DELETE_FLOOR / TELA_WEBDAV_DELETE_FRACTION

Mass-delete guard tuning.

TELA_WEBDAV_FILE_MAX_BYTES

Per-file upload cap for space files.

TELA_ADDR

Backend listen address. Default :8080.

TELA_LOG_FORMAT

json for structured logs. Default text.

TELA_API_KEY_AUDIT_DAYS

PAT audit-log retention in days.

TELA_EVENTS_RETENTION_DAYS

Activity-feed GC window. Default 180.

TELA_DISABLE_WELCOME_SEED

Any value skips seeding the welcome space on first boot.

TELA_VERSION / TELA_COMMIT

Build metadata surfaced by GET /api/version (auto-stamped by make).

The split/deploy topology adds image-ref and Umami-analytics vars (TELA_BACKEND_IMAGE, TELA_FRONTEND_IMAGE, UMAMI_APP_SECRET, UMAMI_DB_PASSWORD, …). See deploy/.env.example and docs/deploy.md.

Connect your agents (MCP)

tela's MCP server is built into the backend at /api/mcp — it self-authenticates with a personal access token (PAT) as a bearer header. Modern hosts speak HTTP transport directly:

https://telawiki.com/api/mcp            # tela cloud
https://your-host.example.com/api/mcp   # your self-hosted origin

For hosts that can't speak HTTP transport (or want a stdio bridge), the tela-mcp npm package is a thin stdio↔HTTP proxy to the same endpoint — no second tool implementation to drift. Add it to your MCP client config (e.g. Claude Desktop / Cursor):

{
  "mcpServers": {
    "tela": {
      "command": "npx",
      "args": ["-y", "tela-mcp"],
      "env": {
        "TELA_BASE_URL": "https://telawiki.com",
        "TELA_API_KEY": "tela_pat_xxxxxxxx"
      }
    }
  }
}

Point TELA_BASE_URL at your own origin to use a self-hosted instance. Generate a PAT in Settings → API tokens; per-tool write permission is enforced server-side. The proxy requires Node ≥ 20. See mcp/README.md for the full tool catalog and troubleshooting.

One-click install

Add to Cursor Add to VS Code

Both buttons add the HTTP endpoint; auth is handled by OAuth on first use, so no token goes in the link.

Per-client setup

HTTP-transport hosts connect to the endpoint directly and sign in via OAuth. stdio-only hosts use the tela-mcp proxy with a PAT (TELA_BASE_URL + TELA_API_KEY).

Claude Code (CLI, HTTP):

claude mcp add --transport http tela https://telawiki.com/api/mcp

Cursor (HTTP) — use the button above, or add to ~/.cursor/mcp.json:

{ "mcpServers": { "tela": { "url": "https://telawiki.com/api/mcp" } } }

VS Code (HTTP) — use the button above, or:

code --add-mcp '{"name":"tela","type":"http","url":"https://telawiki.com/api/mcp"}'

ChatGPT — install Tela from the plugin directory and sign in. Nothing to paste, no Developer Mode. (The directory plugin talks to the hosted service; for a self-hosted instance add a custom connector with your own URL, as below.)

Claude.ai / self-hosted ChatGPT (OAuth connector) — add a custom connector and paste the URL; complete the sign-in:

https://telawiki.com/api/mcp

Claude Desktop (stdio proxy) — claude_desktop_config.json:

{
  "mcpServers": {
    "tela": {
      "command": "npx",
      "args": ["-y", "tela-mcp"],
      "env": { "TELA_BASE_URL": "https://telawiki.com", "TELA_API_KEY": "tela_pat_xxxxxxxx" }
    }
  }
}

Windsurf (stdio proxy) — ~/.codeium/windsurf/mcp_config.json, same mcpServers shape as Claude Desktop above.

Codex (stdio proxy) — ~/.codex/config.toml:

[mcp_servers.tela]
command = "npx"
args = ["-y", "tela-mcp"]
env = { TELA_BASE_URL = "https://telawiki.com", TELA_API_KEY = "tela_pat_xxxxxxxx" }

A machine-discovery manifest is published at /.well-known/mcp.json.

Screenshots

Ranked full-text search across every space you can read, with the matching line in context:

Atlas documents a repo and then audits its own coverage — 6/6 must-cover surfaces documented, 42 citations, and the exact file:line gaps it hasn't covered:

Atlas coverage audit: 13/19 surface covered, 6/6 must-cover documented, 42 citations with 0 unresolved, and a list of undocumented exports with their file:line locations

Architecture

  • Backend — Go (module github.com/zcag/tela/backend, entry cmd/tela). Hand-written database/sql over the pgx/v5 stdlib driver — no ORM, no sqlc. Embedded, forward-only SQL migrations run automatically on boot.

  • Database — PostgreSQL 17 with the pgvector extension (pgvector/pgvector:pg17). FTS lives in pages.search_tsv (ranked ts_rank_cd); semantic chunks live in page_chunks.embedding vector(1024).

  • Frontend — React 19 + Vite + TypeScript + Tailwind v4 + Radix + a Milkdown (@milkdown/kit) editor, with TanStack Query/Router, Orama, cmdk, and Storybook. Owned, token-driven UI components only.

  • Live collaboration — Yjs + y-prosemirror over a custom WebSocket transport, scoped tightly to src/lib/collab/* and the collab branch of the editor; it rebases onto the canonical markdown on save.

  • Built-in MCP — the tool/resource surface lives in the Go backend (internal/api/mcp*.go) and calls the same core functions the REST routes do, so there is one implementation. mcp/ is a dumb stdio↔HTTP pipe published as tela-mcp on npm.

  • Atlas — the documentation engine that drafts and maintains wiki pages from your sources, sharing the configured LLM endpoint.

  • Render sidecars — Gotenberg for HTML→PDF export; a Slidev deck sidecar for presentation pages.

  • Edge — Caddy serves the SPA, the API, the marketing landing at the apex, and (in direct-TLS mode) on-demand certificates for org custom domains.

Deeper internals, ops, and gotchas live in docs/ — start with docs/architecture.md, and docs/decisions.md for the rationale (PostgreSQL, custom collab transport, MCP-as-thin-client).

Self-host vs cloud

  • Self-host — run the whole stack with make up (or docker compose). You own the data, the markdown, and the Postgres volume; AI features are bring-your-own-endpoint (or the bundled Ollama profile). The split/registry deploy topology for shared-edge boxes is in docs/deploy.md.

  • Cloud — a managed instance is hosted at telawiki.com with a free tier, plus optional managed semantic search and ask-your-docs so you don't have to run an embedder or LLM yourself.

Both run the same code from this repository.

Contributing

  • Commit format: type(scope): summary (e.g. feat(backend): hybrid chunk search). Concise messages, no co-author trailer.

  • No issue/task tracker — please don't open GitHub issues or reference #NNN. Discuss via pull requests.

  • Backend changes use hand-written SQL and a new forward-only NNNN_name.sql migration (never edit an applied one). Frontend changes use owned Radix/token-based primitives — no hardcoded hex/px, no third-party component kits.

  • Run make test (backend) and npm run build in frontend/ before sending a change. See CLAUDE.md and docs/ for the full conventions.

Security

Please report security issues privately to tela@telawiki.com, not as a public issue or PR. Policy and acknowledgements: SECURITY.md.

License

tela is open core. Copyright © tela contributors. The Community core — the whole product — is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0): self-host, modify, and redistribute under its terms (run a modified version as a network service and you must offer your users the corresponding source). The tela-mcp npm package is published under AGPL-3.0-only. For a commercial license without AGPL obligations (e.g. to embed or offer tela as a closed service), contact the maintainer.

The Enterprise Edition (backend/internal/ee/, source-available, not AGPL) adds the company-of-record layer (SSO, audit, SCIM, governance) and requires a license key for production use — see backend/internal/ee/LICENSE.md. Full structure in docs/licensing.md.

"tela", the tela name, and the tela logo are trademarks and are not licensed under the AGPL — see TRADEMARK.md. You may run and fork the code, but you may not use the tela branding for a redistributed or hosted version without permission.

Available Tools

50 tools
add_commentAdd commentAInspect

Comment on a page (editor+). Omit parent_id for a ROOT comment: it needs an anchor, a {prefix, exact, suffix} text triplet that pins it to a passage so it survives edits to the page. Pass parent_id to REPLY inside an existing thread (no anchor; replying to a reply is rejected) — that is how you answer a person's comment, rather than posting a second root beside theirs. ANCHOR TEXT IS THE PAGE'S PLAIN TEXT, NOT ITS MARKDOWN: inline markers are stripped (**ship it** is anchored as ship it), blocks are joined by single newlines, and prefix/suffix hold at most 32 characters of surrounding context. Quote the passage as a reader sees it, not as get_page returns it. Pass idempotency_key to make retries safe (a repeat returns the original comment instead of posting a duplicate). Use for feedback ON page content; to report problems with tela itself use submit_feedback.

NameRequiredDescriptionDefault
bodyYescomment text (1-10000 chars)
anchorNotext-quote anchor locating the comment in the page's PLAIN TEXT (markdown markers stripped); required for a root comment, omit when replying
page_idYespage to comment on
parent_idNoid of the root comment to reply to; omit to start a new thread
idempotency_keyNooptional client-generated key; a retry with the same key returns the original result instead of posting a duplicate comment (safe retries after a dropped connection)

Output Schema

NameRequiredDescription
commentYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, and the description adds context those hints cannot convey: the editor+ permission requirement, the root-vs-reply precondition on anchor, the rejection of replies-to-replies, and idempotency_key semantics for safe retries (a repeat returns the original comment rather than duplicating). No contradictions with the annotations.

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?

Dense but front-loaded: the root-vs-reply rule leads, then anchor mechanics, then idempotency, then the sibling routing. Every sentence carries operational information, though the parenthetical-heavy run-on style makes it a wall of text rather than cleanly chunked guidance.

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

Completeness5/5

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

For a 5-parameter mutation tool with an output schema (so return values need no explanation) and annotations covering the safety profile, the description covers the remaining gaps: permissions, the anchor precondition for roots, the reply precondition and its rejection case, and retry safety. Nothing needed to call it correctly is missing.

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

Parameters5/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 meaning the schema does not carry: anchor text must be the page's plain text with markdown markers stripped (`**ship it**` -> `ship it`), blocks joined by single newlines, and prefix/suffix limited to at most 32 characters of context. It also explains the retry behavior of idempotency_key beyond the schema's brief note.

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+resource ('Comment on a page') and immediately scopes it with a permission level ('editor+'). It distinguishes itself from siblings by explicitly routing 'problems with tela itself' to submit_feedback and by separating root comments from replies, so an agent can tell it apart from list_comments and update_comment.

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?

Gives explicit branching rules: omit parent_id for a root comment (which then requires an anchor), pass parent_id to reply inside a thread, and use submit_feedback for product problems. It also names a rejected case ('replying to a reply is rejected'), which is exactly the kind of exclusion that prevents misinvocation.

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

atlas_list_projectsList atlas projectsA
Read-only
Inspect

List the atlas doc-generation projects you can see (your personal ones plus those of every org you belong to). Each project carries its owner, output space, schedule, source count, and latest-run summary (status + last must-cover rate); can_manage says whether you may trigger runs. Start here to find a project_id for atlas_run, or to read coverage health at a glance.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
projectsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare a safe read-only, closed-world operation, so the bar is lower. The description still adds useful context: the visibility rule (personal + all orgs) and the meaning of `can_manage` (whether you may trigger runs), which goes beyond what the safety hints provide.

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

Conciseness5/5

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

Three sentences, front-loaded with the scope, then the payload contents, then the routing guidance. No sentence is filler; each adds a distinct fact.

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?

An output schema exists, so return fields need not be exhaustively explained, and for a zero-param read-only list the description covers scope, contents, and workflow entry point adequately. Nothing needed to call it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4 and there are no parameter semantics to document or compensate for.

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 (list) and resource (atlas doc-generation projects) plus the exact visibility scope (personal plus every org the user belongs to). An agent can distinguish it from siblings like atlas_run and atlas_run_status 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?

Explicitly tells the agent to 'start here to find a project_id for atlas_run, or to read coverage health at a glance', naming the downstream tool and the reason to call this one. It does not state when-not to use it or contrast with atlas_run_status, so not quite a full 5.

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

atlas_runRun atlas generationAInspect

Trigger a FULL doc-generation run for every source in an atlas project (project_id from atlas_list_projects): re-ingest the sources, regenerate the cited pages, and re-audit coverage. Management-level (project owner / org admin) — a run fetches the sources, spends LLM budget, and rewrites the generated subtree (creating the output space on the first run). Returns run_ids (one per source); poll each with atlas_run_status. Returns 503 ai_unavailable when the instance has no embedder/LLM configured.

NameRequiredDescriptionDefault
project_idYesid of the atlas project to generate docs for (from atlas_list_projects)

Output Schema

NameRequiredDescription
run_idsYes

TDQS

A4.5/5.0
Behavior4/5

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

Discloses key behaviors: fetches sources, spends LLM budget, rewrites generated subtree, creates output space on first run, returns run_ids and 503 error. Adds value beyond annotations which only indicate non-destructive and non-read-only.

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?

Concise, front-loaded with purpose, and every sentence adds value—no redundancy or fluff.

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?

Given presence of output schema, description sufficiently covers return values (run_ids) and error conditions (503 ai_unavailable), along with permissions and side effects.

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 covers project_id with description, and the description reinforces where to obtain it ('from atlas_list_projects'), aiding in parameter selection and reducing ambiguity.

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?

Description clearly states it triggers a full doc-generation run for all sources in an atlas project. Specific verb 'trigger', resource 'atlas project', and differentiates from sibling tools like atlas_run_status and atlas_list_projects.

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?

Explicitly states management-level access requirement (project owner/org admin), mentions spending LLM budget, and explains the 503 error condition. Lacks explicit when-not-to-use guidance but provides strong context for appropriate use.

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

atlas_run_statusGet atlas run statusA
Read-only
Inspect

Read an atlas run's status and coverage by run_id (view+). Returns the run's status + current stage and, once auditing has run, coverage (must_rate = the headline fraction of must-cover surface documented, surface_rate, gap_count + the gap list of undocumented surface items) and stats (files / surface / chunks / pages). Use to follow a run started by atlas_run to completion and judge whether the docs are complete.

NameRequiredDescriptionDefault
run_idYesid of the run to read (from atlas_run)

Output Schema

NameRequiredDescription
runYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and destructiveHint=false, so the agent knows it is a safe read operation. The description adds behavioral context by detailing the return values (status, stage, coverage, stats) and their semantics, which goes beyond the annotations.

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?

The description is concise (about 50 words) and front-loaded with the purpose. Each sentence adds value: purpose, return details, and usage guidance. No redundant 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?

The description fully explains the output including status, stage, coverage metrics (must_rate, surface_rate, gap_count, gap list), and stats (files, surface, chunks, pages). It also provides usage context. With an output schema present, the description covers all necessary details.

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?

The input schema has only one parameter (run_id) with 100% description coverage, so the schema already explains it. The description mentions 'run_id (view+)', which might hint at required permissions, but does not add significant meaning beyond the schema. Baseline 3 is appropriate.

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 clearly states the tool reads an atlas run's status and coverage by run_id, specifying the verb ('read') and resource ('atlas run status'). It distinguishes from the sibling 'atlas_run' which starts the run, and details the output.

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?

The description explicitly states when to use: 'Use to follow a run started by atlas_run to completion and judge whether the docs are complete.' This provides clear context and implies not to use it before starting a run, with 'atlas_run' as the complementary tool.

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

confirm_attachment_uploadConfirm a direct uploadA
Idempotent
Inspect

After the bytes have been PUT to a request_attachment_upload URL, return the stored file's serve URL + ready-to-embed markdown (for hosts that couldn't read the PUT response). Editor+. Then place the snippet with update_page/patch_page.

NameRequiredDescriptionDefault
upload_idYesthe upload_id from request_attachment_upload

Output Schema

NameRequiredDescription
attachmentYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations cover the safety profile (write, non-destructive, idempotent, closed-world) and the description is consistent with them. It adds value beyond the annotations by disclosing what the call returns (serve URL + ready-to-embed markdown) and the 'Editor+' authorization requirement.

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?

Dense and front-loaded: the precondition comes first, then the return value, then the follow-up action. It is terse and every clause carries meaning, though the parenthetical and trailing instruction make it slightly crammed into one 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?

An output schema exists, so return values need not be fully explained, yet the description still summarizes them usefully. Combined with the permission note and the workflow chain (request_attachment_upload -> confirm -> update_page/patch_page), an agent has everything needed to call it correctly.

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 single parameter (upload_id) is fully documented in the schema as coming from request_attachment_upload. The description adds no format or syntax details beyond that, so 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 (confirm) and resource (attachment upload), and pins the exact precondition: bytes already PUT to a request_attachment_upload URL. It clearly distinguishes itself from the sibling request_attachment_upload by describing the post-upload step rather than the request itself.

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 says when to use it (after the PUT to the request_attachment_upload URL) and names the follow-up tools (update_page/patch_page) for placing the snippet. The alternative path is also implied for hosts that can't read the PUT response, giving a clear routing decision.

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

create_pageCreate pageAInspect

Create a page in a space (editor+). Body is markdown; tela://page/{id} links and [[Page Title]] wikilinks (resolved by title within the space) are indexed as backlinks. tela renders a rich block palette beyond plain markdown — to-do list, pull quote, callout, collapsible, tabs, kanban board, stat grid, timeline, calendar, poll, chart, embed, mermaid diagram, image, file attachment, code block, equation, inline math, table, highlight, wikilink, footnote. Prefer these over walls of text; read the tela://authoring-guide resource (or this server's instructions) for exact syntax. After writing, call lint_page — the reader silently drops raw HTML and unwraps unrecognized blocks, which you cannot see from the markdown. When asked for a presentation, slides, a slide deck, or a talk (any phrasing) — not a prose doc — set the page property deck=true (and optionally variant=) and write the body as slides separated by --- using the tahta layouts; call the deck_authoring_guide tool (or read the tela://deck-authoring-guide resource) for the layouts, fields, components, and variants. When asked for a spreadsheet, a table of data with formulas/totals, a budget, a tracker, or any grid that computes — not a prose doc — set the page property sheet=true and write the body as Defter markdown (compact GFM tables + an optional ```defter-style block); call the sheet_authoring_guide tool (or read the tela://sheet-authoring-guide resource) for the format, formulas, and styling.

NameRequiredDescriptionDefault
bodyYesmarkdown body
propsNooptional page properties (frontmatter); free-form keys, reserved keys like id/title/slug/created are ignored
titleYespage title
statusNooptional: 'draft' (work in progress: labelled in the app and kept off public spaces and share links) or 'published' (the default)
space_idYesid of the space to create the page in
parent_idNooptional parent page id
idempotency_keyNooptional client-generated key; a retry with the same key returns the original result instead of creating a duplicate page (safe retries after a dropped connection)

Output Schema

NameRequiredDescription
lintNo
pageYes

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: 'editor+' permission requirement, backlink indexing from tela://page links and [[wikilinks]], and the critical caveat that the reader silently drops raw HTML and unwraps unrecognized blocks in ways invisible from the markdown. That silent-mutation disclosure is exactly the kind of context annotations (readOnly=false, destructive=false) cannot convey.

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?

Core purpose is front-loaded and every sentence carries information for a genuinely complex authoring tool, but the single dense paragraph mixes capability catalog, syntax pointers, validation caveats, and two long mode-specific instructions without any structural breaks, making it heavier to scan than necessary.

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

Completeness5/5

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

For a 7-param tool with an output schema, the description covers what an agent needs: what a body may contain, which format modes exist, which guide resources/tools to consult for exact syntax, and the post-write lint step. Return-value explanation is rightly left to the output schema.

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 baseline is 3, but the description adds real meaning: the body is markdown with wikilink/backlink semantics and a large valid block palette, and the free-form `props` object gains concrete documented keys (deck, variant, sheet) that the schema does not enumerate.

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?

Opens with a specific verb+resource+scope: 'Create a page in a space (editor+)'. It further distinguishes the tool from siblings by naming the follow-up/related tools (lint_page, deck_authoring_guide, sheet_authoring_guide) and the two property-driven modes (deck=true, sheet=true) that change what the body must contain.

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 explicit conditional routing: decks when asked for presentations/slides/talks, sheets when asked for spreadsheets/budgets/trackers, and mandate to call lint_page after writing. It does not state when to prefer this over siblings like update_page/patch_page, but the creation context is implied by the name and required params.

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

create_spaceCreate spaceAInspect

Create a space; the caller becomes its owner (write scope). slug is derived from name when omitted. Use to start a new top-level container of pages; to add a page inside an existing space use create_page, and to rename a space use update_space.

NameRequiredDescriptionDefault
nameYesspace name (1-200 chars)
slugNooptional url slug; derived from name when omitted
org_idNooptional org id to own the space (caller must be a member); omit for a personal space
idempotency_keyNooptional client-generated key; a retry with the same key returns the original result instead of creating a duplicate space (safe retries after a dropped connection)

Output Schema

NameRequiredDescription
spaceYes

TDQS

A4.4/5.0
Behavior4/5

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

Adds behavior beyond the annotations: the caller becomes owner with write scope, and slug is auto-derived from name when omitted. With readOnlyHint=false / destructiveHint=false already covering the safety profile, the remaining gap is silence on failure modes (e.g. name/slug collisions) and whether ownership is transferable.

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 ownership effect come first, the routing guidance second; 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?

For a 4-param create tool with a full schema and an output schema covering return values, the description supplies purpose, ownership semantics and sibling routing — enough to call it correctly. It stops short of noting collision/error behavior, but nothing essential 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 the schema already documents name, slug, org_id and idempotency_key in detail. The description only restates the slug-derivation rule, which the schema also states, so it adds no meaning beyond structured data — baseline 3.

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+resource ("Create a space") plus the ownership consequence, which is more than a name restatement. It explicitly distinguishes itself from create_page and update_space, so an agent can route without opening sibling schemas.

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?

Gives an explicit when-to-use ("start a new top-level container of pages") and names two alternatives with the conditions that select them: create_page for adding pages to an existing space, update_space for renaming. Nothing is left to inference.

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

deck_authoring_guideDeck authoring guideA
Read-only
Inspect

Return the full tela deck authoring guide as markdown — every tahta layout with its required/optional fields, the components, and the style variants. Read this FIRST when creating or editing a deck (a deck=true page) so you don't guess at layouts/fields. The guide lists optional capability modules (e.g. branding, imagery); when one applies, call again with module="" to fetch that extra guidance.

NameRequiredDescriptionDefault
moduleNoOptional capability module id (e.g. branding, imagery) to fetch instead of the core guide.

Output Schema

NameRequiredDescription
guideYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and destructiveHint. Description adds that it returns markdown, lists content types, and describes module usage, providing behavioral context beyond annotations.

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 concise sentences with no fluff. Front-loaded with core purpose, followed by usage guidance and module explanation.

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?

Given the simple tool (one optional parameter, annotations, output schema), the description covers purpose, usage, and parameter behavior fully. No gaps.

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%. Description reinforces the parameter's purpose and adds usage context ('when one applies, call again with module="<id>"'), enhancing meaning beyond the schema alone.

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?

Description states 'Return the full tela deck authoring guide as markdown' specifying the resource and action, and distinguishes from siblings by advising 'Read this FIRST' when creating or editing a deck.

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?

Explicitly says to read this first when creating or editing a deck, avoiding guesswork. Also explains how to use the module parameter for extra guidance. Does not explicitly state when not to use, but context is clear.

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

delete_attachmentDelete attachmentA
Destructive
Inspect

Detach a file from a page by attachment id (editor+; ids come from list_attachments). Soft-delete. It does NOT edit the page body, so remove any inline embed separately with update_page/patch_page.

NameRequiredDescriptionDefault
idYesattachment id (from list_attachments)
page_idYesthe page the file is attached to

Output Schema

NameRequiredDescription
okYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true. The description adds the key behavioral detail that it is a soft-delete, and confirms no impact on page body, providing context beyond annotations.

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 concise sentences. First sentence covers main purpose and prerequisites; second clarifies limitations and alternatives. No fluff, front-loaded.

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

Completeness5/5

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

For a simple deletion tool with 2 parameters and output schema, the description covers purpose, usage, behavioral traits, and schema references adequately. No gaps given the complexity.

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 covers 100% of parameters with descriptions. The tool description does not add extra parameter details beyond what is already in the schema, so baseline score of 3 is appropriate.

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 clearly states 'Detach a file from a page by attachment id', specifying the action, resource, and identifier. It also distinguishes from editing the page body, differentiating it from sibling tools like update_page.

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 when to use ('editor+; ids come from list_attachments') and when not to use ('It does NOT edit the page body'), with clear alternatives ('remove any inline embed separately with update_page/patch_page').

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

delete_pageDelete pageA
Destructive
Inspect

Delete a page (editor+). Backlinks from other pages are preserved with the last-known title.

NameRequiredDescriptionDefault
idYespage id to delete

Output Schema

NameRequiredDescription
okYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true. The description adds valuable behavioral context: backlinks are preserved with the last-known title. This goes beyond what annotations provide, though it omits details like deletion permanence or side effects on other entities.

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?

The description is extremely concise: two sentences, no filler. The action is front-loaded in the first sentence, and the second sentence provides a key behavioral note. Every word 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?

Given the tool's simplicity (1 parameter, output schema exists), the description covers the core action and an important side effect (backlink preservation). It does not address potential error states or data consequences, but it is reasonably complete for the complexity level.

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 parameter `id` is clearly documented in the schema as 'page id to delete'. The description does not add any additional parameter semantics, so it meets the baseline expectation.

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 clearly states 'Delete a page (editor+)', with a specific verb and resource. It distinguishes from sibling tools like create_page, update_page, and delete_space by specifying the target (page) and required permission level.

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 indicates use for deleting pages with editor+ permissions. It does not explicitly state when not to use or provide alternatives, but the context of sibling tools and the clear action makes the usage fairly obvious.

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

delete_spaceDelete spaceA
Destructive
Inspect

Delete a space AND all its pages, comments, revisions and share links. Owner only. Irreversible.

NameRequiredDescriptionDefault
idYesspace id to delete (cascades)

Output Schema

NameRequiredDescription
okYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already confirm destructiveHint=true, but the description adds important context: cascading deletion of all associated content, ownership requirement, and irreversibility. These details enhance agent understanding beyond the annotation alone.

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?

The description is extremely concise (two sentences) and front-loaded with the core action. Every word adds value—'Delete a space AND all its pages, comments, revisions and share links. Owner only. Irreversible.'

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?

Given the presence of an output schema, the description does not need to detail return values. It adequately covers scope, prerequisites, and irreversibility. The context of sibling tools (e.g., delete_page, update_space) is addressed indirectly by specifying the full cascade.

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% for the single parameter, with 'space id to delete (cascades)' in the schema. The tool description does not add additional meaning to the parameter beyond what the schema provides, so baseline 3 is appropriate.

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 clearly states the action ('delete'), the resource ('space'), and the cascading effect on pages, comments, revisions, and share links. It distinguishes itself from sibling tools like delete_page or delete_attachment by specifying the full scope.

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 explicitly states 'Owner only' and 'Irreversible', providing clear guidance on when to use (only if owner) and the consequence. It does not mention alternatives like archiving, but for a destructive operation this is sufficient.

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

edit_sheetEdit sheet (structured)AInspect

Make a STRUCTURED edit to a sheet (a sheet=true page), editor+. Prefer this over update_page for sheets: you pass a typed operation and tela rewrites the Defter markdown correctly — inserting a row shifts every formula below it, deleting a column re-references the rest, so you never corrupt the grid by hand-editing text. Pass one op (or a batch via ops, applied atomically). Each op is {kind, ...} where kind is one of: setCells {cells:[{ref:"B2",text:"=A2*1.2"}]} — write literals/formulas by A1 ref; insertRows/deleteRows {at:<1-based row>, count?}; insertCols/deleteCols {at:<col letter or 1-based index>, count?}; setStyle {target:"A1:C1"|"B"|"2", attrs:{...}} — bold/align/fill/number-format a range/col/row; setFreeze {rows?, cols?} — freeze N header rows / M leading cols (0 clears); addSheet {name, after?}; renameSheet {sheet, name}; deleteSheet {sheet}. Ops that target a specific tab take an optional sheet (name or 0-based index; defaults to the first). A bad ref/range/sheet is rejected with a fixable error. Call sheet_authoring_guide for the full op reference, cell/style syntax, and formula functions. Returns the updated sheet with formulas computed.

NameRequiredDescriptionDefault
opNoa single SheetOp object with a 'kind' field. Provide this OR ops.
opsNoan ordered batch of SheetOps applied atomically (all-or-nothing; the sheet is only rewritten if every op succeeds). Provide this OR op.
page_idYesthe sheet page id to edit (a page with sheet=true)

Output Schema

NameRequiredDescription
pageYes

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial context beyond annotations: editor+ auth requirement, atomic all-or-nothing batch semantics, that bad refs/ranges/sheets are rejected with a fixable error, and the return shape ('updated sheet with formulas computed'). Annotations only cover the read/write safety profile, so the description carries the informative load but doesn't cover rate limits or partial-failure edge cases explicitly.

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?

Front-loaded with the core distinction and the 'prefer over update_page' rationale before the op catalog. It is dense and longer than typical, but nearly every clause carries unique operational value; a slightly tighter op enumeration would be ideal.

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

Completeness5/5

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

For a complex nested-op mutation tool this is complete: it covers when to use it, the op vocabulary, atomicity, error behavior, default targeting, and points to sheet_authoring_guide for the full reference. With an output schema present, it correctly leaves return details to structured data while still noting formulas are computed.

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% (baseline 3), and the description meaningfully exceeds it by enumerating every op kind with payload shapes (setCells, insert/delete rows/cols, setStyle, setFreeze, addSheet, renameSheet, deleteSheet), the 1-based/col-letter conventions, and the default-sheet behavior. It defers full syntax to sheet_authoring_guide, so it stops short of being exhaustive.

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 ('Make a STRUCTURED edit to a sheet'), scopes it to sheet=true pages, and explicitly differentiates from update_page. An agent can distinguish it from patch_page/update_page 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 Guidelines5/5

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

Explicit routing: 'Prefer this over update_page for sheets' and it explains why (typed ops prevent corrupting formulas/grid by hand-editing text). It also names sheet_authoring_guide as the reference for advanced syntax, and states the 'op OR ops' selection rule.

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

fetchFetch documentA
Read-only
Inspect

Fetch a tela page's full text by id (the id comes from a search result) — the fixed-shape companion to search. Read-only. Prefer get_page for normal use (same body plus richer metadata and trust signals); reach for fetch only when the host requires the fixed search/fetch contract.

NameRequiredDescriptionDefault
idYespage id, as returned by search results

Output Schema

NameRequiredDescription
idYes
urlYes
textYes
titleYes
metadataYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, so the explicit 'Read-only' line is mildly redundant. However, the description adds real behavioral context the annotations don't carry: it returns the page's full text in a fixed shape and hints that get_page supplies richer metadata and trust signals, which frames the trade-off.

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, front-loaded with the core purpose, followed by routing guidance. Every clause earns its place; nothing is padding.

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 an output schema present, return values need not be explained, and the description covers purpose, safety, and routing adequately for a single-parameter read tool. Nothing an agent needs to call 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 coverage is 100% and the sole `id` parameter is fully documented in the schema. The description's note that the id 'comes from a search result' restates the schema wording rather than adding syntax, format, or edge-case detail, so the baseline 3 holds.

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 (fetch) and resource (a tela page's full text by id) and immediately distinguishes itself from both `search` (it is the fixed-shape companion) and `get_page` (same body, less metadata). An agent can select it 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 Guidelines5/5

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

Explicit routing: prefer get_page for normal use, and reach for `fetch` only when the host requires the fixed search/fetch contract. It names the alternative, the default choice, and the exact condition that selects this tool.

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

find_overlapsFind overlapping pagesA
Read-only
Inspect

Near-duplicate page PAIRS that share a near-identical passage (real merge/redirect candidates) for wiki hygiene. Optional space_id restricts to one space; threshold (0..1, default 0.92) is the minimum chunk-level similarity to count as a duplicate.

NameRequiredDescriptionDefault
limitNomax pairs (default 50)
space_idNooptional space id to restrict to overlaps within one space
thresholdNomin chunk-level cosine similarity 0..1 to count as a duplicate (default 0.92)

Output Schema

NameRequiredDescription
overlapsYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and destructiveHint=false. Description adds transparency by specifying return of page pairs and chunk-level similarity mechanism, without contradicting annotations.

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?

Single sentence front-loads the verb and resource, with no extraneous words. Every part adds value.

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?

Output schema exists, so return values are covered. Description addresses purpose, optional parameters, and defaults, sufficient for a read-only list tool with clear annotations.

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%, but description adds meaning by explaining 'limit' as max pairs, 'space_id' as optional restriction, and 'threshold' as minimum cosine similarity with default 0.92, enhancing schema descriptions.

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 clearly states it finds near-duplicate page pairs that share a near-identical passage, with a specific wiki hygiene goal. It distinguishes from siblings like 'related_pages' by focusing on merge/redirect candidates.

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?

Describes optional parameters for restricting to a space and setting threshold, implying usage for duplicate detection. Does not explicitly state when not to use, but the context of wiki hygiene and 'near-duplicate' pairs provides implicit guidance.

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

generate_deck_imageGenerate deck imageAInspect

Generate an image from a prompt and attach it to a deck page (editor+), ready for a bg:/image: slot. Returns the serve URL + a snippet; reference it by path (don't regenerate on re-render). Read the imagery module first (deck_authoring_guide module="imagery"): most slides need NO image — use it for atmosphere/concept/focal only, reuse ONE background, write rich on-palette prompts, and prefer images raw. May be unavailable (503) if the instance hasn't configured image generation or AI is paused; generation can take from ~20s to a few minutes depending on the model.

NameRequiredDescriptionDefault
idYesid of the deck page to attach the generated image to
nameNooptional attachment filename (default deck-image-<n>.png)
seedNooptional seed for reproducibility
sizeNoWxH, default 1280x720 (16:9 — the cover/bg/bleed slot aspect)
modelNooptional model override (else the endpoint default)
stepsNosampling steps; ~10 for hero/cover, ~4 for incidental texture (more ≈ linearly slower). Omit for the model default
promptYesthe image prompt — rich and specific (scene, light, texture, on-variant colours). For FLUX models append 'no text, no letters, no words' or it invents garbled type; OMIT that only when you deliberately want legible in-image text

Output Schema

NameRequiredDescription
urlYes
noteYes
markdownYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=false, etc.), the description adds critical behaviors: attaches to deck page, requires editor+, returns URL and snippet, may be unavailable (503), generation time varies, and advises against regeneration. Model-specific advice (FLUX) further enhances transparency.

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?

Front-loaded with main action and returns. While somewhat lengthy, every sentence adds value. Could be slightly trimmed but remains efficient for the information density.

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?

Covers all necessary aspects: action, requirements, usage rules, error conditions, timing, and return format. With an output schema existing, the description still provides ample context for correct invocation.

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%, but description adds meaningful guidance: rich prompts with FLUX append note, steps number suggestions, size default with aspect ratio. This elevates understanding beyond schema definitions.

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 clearly specifies the verb 'generate' and the resource 'image from a prompt attached to a deck page'. It distinguishes from siblings like 'treat_deck_image' by focusing on generation with prompt, and provides context on usage (atmosphere/concept/focal only).

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

Usage Guidelines5/5

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

It explicitly states when to use ('atmosphere/concept/focal only'), when not to use ('most slides need NO image'), and directs to the imagery module for guidance. Also mentions potential unavailability and timing, aiding agent decision.

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

get_pageGet pageA
Read-only
Inspect

Full markdown body + metadata for a numeric page id. Includes an epistemic block — trust signals computed from the wiki's own state: freshness (age, stale, review_overdue), provenance (human / agent / sync), and corroboration vs. dispute against same-space pages. Weigh it: prefer fresh, corroborated, human-reviewed pages; treat a stale or disputed page as lower-confidence and check its listed disputes before relying on it.

NameRequiredDescriptionDefault
idYesnumeric page id
formatNo'full' (default) returns the markdown body; 'map' returns just the heading outline (section levels + paths) and no body — cheap to read, and each path is a target for patch_page; 'values' — for a SHEET page (sheet=true), returns the computed spreadsheet as self-describing prose (formulas materialized to their numbers, styling stripped) so you read the answers, not the raw =formulas (no effect on non-sheet pages)

Output Schema

NameRequiredDescription
pageYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description doesn't need to restate safety. However, it adds substantial behavioral context: it explains the epistemic block's trust signals (freshness, provenance, corroboration vs. dispute) and how to interpret them. This goes beyond the annotations, providing decision-making guidance.

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?

Front-loaded with the core return, then explains the epistemic block. Every sentence earns its place, though the second sentence is fairly dense. Overall efficient.

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 an output schema present, the description needn't detail return values. It covers the key addition (epistemic signals) and their interpretation. Could mention pagination or size limits, but for a page retrieval tool it's largely complete.

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%, so the schema already documents both parameters, including the format modes. The description adds no additional parameter semantics beyond what's in the schema. Baseline 3 is appropriate.

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 (page) with the exact return content (full markdown body + metadata for a numeric page id). The scope is precise and clear.

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 explains how to weigh the epistemic block, but does not explicitly state when to use get_page versus siblings like read_chunk, get_page_revision, or search. For a retrieval tool among many read alternatives, more routing guidance would help.

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

get_page_revisionGet page revisionA
Read-only
Inspect

One historical revision of a page: its title, full markdown body and properties as they were at that point (read-only, editor+ on its space). Take revision_id from list_page_revisions. Works for trashed pages. For the page as it is now use get_page.

NameRequiredDescriptionDefault
page_idYespage the revision belongs to
revision_idYesrevision id from list_page_revisions

Output Schema

NameRequiredDescription
pageYes
revisionYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, so the safety profile is covered. The description adds useful context beyond that: the required access level ('editor+ on its space') and the trashed-page behavior. It could still note output format or whether historical bodies can differ structurally, but for a read tool this is solid added value.

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 dense sentences: the first defines the return payload and access requirement, the second gives the input source and the sibling alternative. No filler, and the payload definition is front-loaded.

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?

An output schema exists, so return values need not be re-explained, and the description still names the key fields. With annotations, schema, and an output schema in place, the description covers the remaining gaps (access level, trashed pages, sibling routing) without redundancy.

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%, with both parameters documented in the schema itself ('page the revision belongs to', 'revision id from list_page_revisions'). The description reinforces the revision_id provenance but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate.

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 ('One historical revision of a page') and enumerates exactly what's returned: title, full markdown body, and properties as they were at that point. It distinguishes itself from get_page ('For the page as it is now use get_page') and from list_page_revisions ('Take revision_id from list_page_revisions').

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 routes the agent: it tells you where to get the input (revision_id from list_page_revisions) and names the alternative for the live page (get_page). It also adds the non-obvious condition that it works for trashed pages.

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

get_spaceGet spaceA
Read-only
Inspect

Fetch one space's metadata (id, name, slug) by id. Read-only. Use when you already hold a space_id and just need its name/slug; to discover spaces use list_spaces, to list its pages use list_pages.

NameRequiredDescriptionDefault
idYesspace id

Output Schema

NameRequiredDescription
spaceYes
owner_orgNo
page_countYes
member_countYes
owner_handleNo

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the 'Read-only' sentence largely repeats structured data. It adds no auth requirements, rate limits, or edge-case behavior (e.g. what happens for an unknown id), so it clears the lowered bar only marginally.

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: the operation and scope come first, then the routing guidance. Every clause earns its place with no filler.

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?

A single-parameter read tool with an output schema, full schema coverage, and explicit safety annotations needs nothing more; the description supplies the one thing structured fields cannot, which is when to reach for this tool versus its siblings.

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% for the single id parameter, so the schema already documents it; the description's 'by id' adds only the framing that the id is a space id you must already possess. 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.

Purpose5/5

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

States a specific verb (Fetch) and resource (one space's metadata) with the exact returned fields (id, name, slug) and the lookup key (by id). It is immediately distinguishable from list_spaces and list_pages, which it names explicitly.

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?

Gives an explicit when-to-use condition ('when you already hold a space_id and just need its name/slug') plus two named alternatives for the adjacent needs: list_spaces for discovery and list_pages for its pages. Nothing is left to inference.

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

import_guideImport an existing folder of filesA
Read-only
Inspect

Return the guide for BULK-importing an existing folder of documents (Word docs, spreadsheets, PDFs, notes) into a space as a page tree — rather than hand-creating pages one at a time. Read this FIRST for any 'import', 'migrate my docs', 'bring in this folder', or 'load these files' request. Covers converting Office files locally (docx → pages, spreadsheets → live sheets), attaching PDFs/images, and the import endpoint's dry-run → confirm → commit contract.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
guideYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already mark it as read-only and non-destructive. The description adds context about local conversion and the endpoint's contract, going beyond annotations. However, it does not mention any limitations or edge cases.

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?

The description is front-loaded with purpose and usage, but the third sentence is slightly dense. Overall efficient, but not perfectly lean.

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 parameters, clear annotations, and an output schema, the description covers the tool's purpose, usage, and behavioral contract completely. No gaps.

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 has zero parameters, and the schema coverage is 100% (trivially). The description does not need to add parameter info; baseline for 0 params is 4.

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 clearly states it returns a guide for bulk-importing documents into a space as a page tree, specifying the types of documents and contrasting with manual page creation. It is specific and distinct from siblings.

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 instructs to read this guide first for any import-related request, providing clear when-to-use guidance. Also outlines the dry-run, confirm, commit contract.

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

invite_to_spaceInvite to space (by email)AInspect

Give a person access to a space by EMAIL ADDRESS — space owner only, write scope. Two outcomes, and the response tells you which happened: if a tela account already uses that address they are added right away and returns {member}; if nobody has that address yet, tela SENDS THEM AN EMAIL INVITATION (an outward action reaching a third party) and returns {invite} — they get the space automatically when they sign up with that address. Role is owner|editor|viewer (default viewer). Use this to onboard someone who has no tela account; to add an existing user you already know by username, or to change/remove access, use the app's space sharing UI.

NameRequiredDescriptionDefault
roleNoowner | editor | viewer (default viewer)
emailYesthe person's email address
space_idYesspace to share (caller must be its owner)

Output Schema

NameRequiredDescription
inviteNo
memberNo

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, openWorldHint=false, destructiveHint=false) by disclosing the two branching behaviors, the fact that an email is sent to a third party when no account exists, the auth constraint ('space owner only, write scope'), and the eventual auto-grant on signup. None of this is derivable from the structured fields.

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?

Purpose is front-loaded in the first clause, and every sentence carries information (outcomes, role, alternatives). It is dense with caps and parentheticals, which is slightly heavy for a 3-parameter tool, but nothing is filler.

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?

Given a mutation tool with an output schema, the description supplies everything the schema and annotations do not: prerequisites (space ownership/write scope), the outward email side effect, the conditional return shape, and the path to alternatives. An agent can invoke it correctly without further inference.

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; the description still adds meaning by restating the role enum with its default (viewer) and the owner-only restriction on space_id. That is useful reinforcement rather than new syntax-level detail.

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

Purpose5/5

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

States a precise verb+resource (give a person access to a space) and immediately narrows the mechanism to EMAIL ADDRESS, distinguishing it from sibling sharing tools. The response-shape summary ({member} vs {invite}) makes the two outcomes unambiguous.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('onboard someone who has no tela account') and when not to ('to add an existing user you already know by username, or to change/remove access, use the app's space sharing UI'). That is a direct routing rule away from alternatives, which is exactly what an agent needs.

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

knowledge_gapsKnowledge gapsA
Read-only
Inspect

The most-asked "ask your docs" questions the corpus could NOT answer — a content roadmap: write these pages next. Covers your own asks plus asks in spaces you're a member of. Optional space_id and since_days window.

NameRequiredDescriptionDefault
limitNomax gaps (default 50)
space_idNooptional space id to restrict the gaps to
since_daysNoonly count asks in the last N days (0 = all time)

Output Schema

NameRequiredDescription
gapsYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish readOnly/destructive=false and closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: the data is unanswered questions, the scope is constrained to the caller's own asks plus asks in spaces they belong to, implying a permission-bounded result set. No rate limit or pagination detail, but the scope note is valuable.

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 sentences, front-loaded with the core purpose then the scoping rule. The em dash aside ('a content roadmap: write these pages next') earns its place by conveying intended use, though the wording is slightly dense and mixes purpose with usage hint.

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?

An output schema exists so return values needn't be described, and annotations cover the safety profile; all three params are schema-documented. The description supplies the conceptual scope and ownership boundary, leaving only minor gaps like result ordering or practical limits for a tool of this complexity.

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 limit, space_id and since_days. The description only re-touches space_id and the since_days window and omits 'limit' entirely, adding no syntax or semantics beyond the schema. 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.

Purpose5/5

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

Names a specific resource ('the most-asked ask-your-docs questions the corpus could NOT answer') and frames it as a content roadmap, which is a distinct, non-obvious resource in a sibling set dominated by page/search/mutation tools. An agent can tell this is an analytics-style list of unanswered questions rather than a search or page tool.

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 'write these pages next' implies the intended follow-up action, but there is no explicit when-to-use vs when-not, no prerequisite stated, and no alternative sibling (e.g. search, suggest_links, find_overlaps) is named or excluded. Usage is implied rather than directed.

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

lint_deckLint slide deckA
Read-only
Inspect

Validate a deck page's slides against the tahta theme contract — unknown layouts, missing required fields, type/format mistakes. Run after authoring/editing a deck to catch problems before presenting. Returns structured issues per slide. For the full list of valid layouts and each layout's fields, call deck_authoring_guide.

NameRequiredDescriptionDefault
idYesid of the deck page to validate

Output Schema

NameRequiredDescription
okYes
hintNo
errorsYes
issuesYes
warningsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so description adds value by stating it returns structured issues per slide, which provides context beyond the safety profile. No contradictions.

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

Conciseness5/5

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

Three sentences, each with clear purpose. First sentence defines action, second gives usage timing and output, third references sibling. No fluff.

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?

Complete for a simple tool: explains what it does, when to use, what output to expect (structured issues), and where to find more info (deck_authoring_guide). Output schema presumably covers return format.

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% with clear description for the single parameter 'id'. Description does not add extra meaning beyond the schema, so baseline 3 is appropriate.

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?

Description clearly states verb 'Validate', resource 'deck page's slides', and scope 'against the tahta theme contract' including specific checks (unknown layouts, missing required fields, type/format mistakes). Distinguishes from siblings like deck_authoring_guide.

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 when to use: 'Run after authoring/editing a deck to catch problems before presenting.' Also provides exclusion and alternative: 'For the full list of valid layouts ... call deck_authoring_guide.'

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

lint_pageLint pageA
Read-only
Inspect

Check a page for places where the READER renders something different from what the markdown says — an unknown :::block or [!CALLOUT] that silently unwraps, raw HTML the reader drops, a collapsible whose blank lines are missing so its body vanishes, a [[wikilink]] that matches no page, a broken link or attachment, a ragged table, a table so wide the page column shows only part of it. These are invisible when you re-read your own source, which is why re-reading it is not a substitute for calling this. Run it after writing or editing a page.

NameRequiredDescriptionDefault
idYesid of the page to check

Output Schema

NameRequiredDescription
okYes
hintNo
errorsYes
issuesYes
warningsYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered structurally. The description adds real behavioral context beyond that: the detection scope (rendered-vs-source divergence), the fact that issues are silent/invisible to re-reading, and that it is a diagnostic rather than a fixer is implied by 'check'. It does not state whether results are page-wide or whether any remediation is offered, keeping it at 4 rather than 5.

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?

Purpose is front-loaded in the first clause, with the triggers appended afterwards. The enumeration of failure modes is long but each item is a concrete, distinct diagnostic case rather than filler, so it earns its length – though it could be tightened without loss.

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?

An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description supplies the problem domain and the timing cue, which is sufficient for a one-parameter read tool. It leaves minor ambiguity about result granularity (page-wide vs per-section), which 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?

With one parameter at 100% schema description coverage, the schema already explains 'id of the page to check'. The description adds no further parameter detail (no scope/range/format options), so the baseline 3 applies – the schema carries this dimension.

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?

Names a specific verb and resource ('Check a page') and defines the exact class of problem: divergence between rendered output and markdown source. The enumerated failure modes (unknown :::block, silently unwrapping callouts, dropped raw HTML, missing wikilinks, broken attachments, ragged/overflowing tables) make it unmistakably distinct from sibling diagnostic tools like lint_deck or preview_page.

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 an explicit trigger ('Run it after writing or editing a page') and pre-empts a likely alternative ('re-reading it is not a substitute for calling this'). It does not name or rule out sibling tools such as preview_page, find_overlaps, or suggest_links, so the routing guidance stops just short of a 5.

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

list_attachmentsList attachmentsB
Read-only
Inspect

List the files attached to a page (uploads AND rclone-synced files): name, mime, byte size, a stable serve URL, an absolute download_url (fetch the bytes), a share_url (give THIS to a person — it opens a page that previews the file and unfurls as a card in chat, where download_url just downloads), and a ready-to-embed markdown snippet. embedded tells you the page body already references the file.

NameRequiredDescriptionDefault
page_idYespage whose attachments to list

Output Schema

NameRequiredDescription
attachmentsYes

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 and destructiveHint=false, so the safety profile is covered. The description adds real behavioral value by explaining the semantic difference between share_url (preview page, chats unfurl) and download_url (raw bytes) and by flagging the `embedded` marker, but it says nothing about ordering, pagination, or empty results.

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

Conciseness3/5

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

The purpose is front-loaded, but the bulk is a single run-on enumeration of return fields (name, mime, size, three URLs, markdown, embedded). Because an output schema exists, most of that enumeration duplicates structured data; only the share_url vs download_url clause clearly 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?

With full schema coverage, safe-read annotations, and a published output schema, an agent has almost everything needed to call this correctly. The remaining gap is tool-selection guidance against list_space_files and the upload/delete attachment siblings.

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 (page_id) and schema description coverage is 100%, so the schema already documents it fully. The description adds nothing about the identifier's form; 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?

Specific verb+resource: 'List the files attached to a page' with an explicit scope qualifier ('uploads AND rclone-synced files'). This distinguishes it from raw file tools, but it never names the nearest sibling (list_space_files) or contrasts scope with it, so sibling differentiation is only implicit.

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 a useful consumer hint ('give THIS to a person') about share_url vs download_url, but nothing about when to choose this tool over list_space_files, get_page, or the attachment-upload tools. No prerequisites or exclusions are stated.

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

list_commentsList commentsA
Read-only
Inspect

Read comments (editor+). Pass page_id for one page's full threads (each root with its replies), or space_id for an inbox of threads across a whole space (roots only, each with reply_count and page_title — drill into the page for the replies). status is open (default), resolved, or all. TO POLL FOR WHAT HUMANS WROTE: keep the cursor this returns and pass it back as since next time — you then get only threads with new or edited activity, including threads someone replied to, and each comes back with its full context. Anchors are the page's PLAIN TEXT, not its markdown (inline markers stripped, blocks joined by single newlines), so match anchor_exact loosely against a get_page body rather than searching for it verbatim. Answer a thread with add_comment(parent_id=…) and close it with update_comment(resolved=true).

NameRequiredDescriptionDefault
limitNomax threads (default 50, max 200)
sinceNoopaque cursor from a previous call; returns only threads with new or edited activity since then
statusNoopen (default) | resolved | all
page_idNopage whose threads to read (root + replies); give this or space_id, not both
space_idNospace whose open threads to read as an inbox (roots only, with reply_count and page_title); give this or page_id, not both

Output Schema

NameRequiredDescription
cursorNopass back as since on the next call to see only what changed
threadsYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/non-destructive, and the description layers on real behavioral context: editor+ permission requirement, roots-vs-replies shape difference between the two modes, cursor polling semantics including edited-activity and full-context returns, and the anchor plain-text caveat. These are traits the annotations do not cover.

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?

Front-loaded with the core verb, then modes, polling pattern, anchor caveat, and related tools in a logical sequence. Despite its length, every sentence carries operational meaning and none restates the schema verbatim.

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 an output schema present, return values need no explanation, yet the description still clarifies the shape difference between modes. Combined with annotations covering safety, nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds value by tying page_id/space_id to their result shapes ('drill into the page for the replies') and framing since as a cursor-returned polling token. The anchor explanation enriches result interpretation though it maps to no 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+resource ('Read comments') and immediately distinguishes the two operating modes: page_id for full threads (root + replies) vs space_id for a cross-space inbox of roots only. An agent can tell this apart from sibling reads like get_page or search without opening the 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?

Explicitly says which parameter selects which behavior, what status values mean, how to poll with cursor→since, and routes follow-up actions to add_comment(parent_id=…) and update_comment(resolved=true). This is when-to-use guidance plus named alternatives.

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

list_page_revisionsList page revisionsA
Read-only
Inspect

A page's revision history, newest first (read-only, editor+ on its space). A revision is snapshotted on every title/body change, by a person, an agent, sync or Atlas. Returns page (with deleted_at set when the page is in the trash, and current_revision_id) and revisions (metadata only: id, created_at, author, source, byte_size, is_current). Works for trashed pages too, so you can recover what a removed page said. Page back with cursor = next_cursor. Read one revision's full text with get_page_revision.

NameRequiredDescriptionDefault
limitNomax revisions (default 50, max 200)
cursorNonext_cursor from a previous call; omit for the newest
page_idYespage whose history to list (may be in the trash)

Output Schema

NameRequiredDescription
pageYes
revisionsYes
next_cursorNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare read-only/no-destructive, and the description adds substantial beyond-that context: when revisions are snapshotted (every title/body change, by a person, agent, sync or Atlas), that it works on trashed pages, and how paging works. It also discloses the response shape including revisions being metadata-only.

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?

Four dense sentences, front-loaded with what the tool returns and followed by scope, snapshot behavior, trash support, paging, and the alternative tool. No filler or repetition.

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?

Given an output schema exists, the description needn't explain return values yet chooses to characterize them (page with deleted_at/current_revision_id; revisions metadata fields). Combined with permissions, snapshot timing, and trash behavior, nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3 and the schema already documents limit and cursor. The description nonetheless clarifies cursor semantics in context ('Page back with cursor = next_cursor'), adding modest value beyond the schema's own wording.

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?

Opens with a specific verb+resource+scope: 'A page's revision history, newest first', and immediately distinguishes itself from get_page_revision by noting that sibling only reads one revision's full text. An agent can select this tool 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 Guidelines5/5

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

States the access requirement ('editor+ on its space'), an explicit alternative for full revision text ('Read one revision's full text with get_page_revision'), and a concrete motivating case ('Works for trashed pages too, so you can recover what a removed page said'). When-to-use and the alternative path are both spelled out.

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

list_pagesList pagesA
Read-only
Inspect

Flat page listing in a space (read-only). Pass parent_id for the direct children of one page; omit for top-level pages. Use to browse a space's structure or find a page_id; to find pages by keyword use search, and to read a page's body use get_page.

NameRequiredDescriptionDefault
statusNooptional: 'draft' or 'published' to list only pages in that state; omit for all
space_idYesid of the space to list pages in
parent_idNooptional parent page id; omit for top-level pages

Output Schema

NameRequiredDescription
pagesYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds useful context beyond that: the listing is 'flat' (no recursive expansion) and the parent_id-omit behavior changes which level is returned. It stops short of describing pagination or result limits, but it is well ahead of a bare read-only flag.

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: purpose and read-only first, then the parent_id scoping rule, then routing to alternatives. Every clause carries information and the load-bearing constraint is front-loaded.

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?

An output schema exists, so return shape need not be described, and the safety profile is fully carried by annotations. The description covers scope, the key parameter's effect, and sibling routing — nothing an agent needs to call this correctly is missing.

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

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 space_id, status, and parent_id. The description restates the parent_id omit-for-top-level rule rather than adding syntax, defaults, or formats beyond the schema. 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.

Purpose5/5

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

States a specific verb ('listing') and resource ('pages') plus the scope ('in a space', 'flat'). It distinguishes itself from search and get_page by name, so an agent can route correctly 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?

Gives explicit use cases (browse a space's structure, find a page_id) and names the two alternatives with the conditions that select them: `search` for keyword lookup and get_page for reading a body. No inference required.

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

list_sharesList share linksA
Read-only
Inspect

List a page's public share links (editor+): id, token, absolute url, has_password, include_descendants, expires_at, revoked_at. Active links only by default; pass include_revoked to also see revoked ones. Tokens are bearer secrets, so this needs a write-scoped key.

NameRequiredDescriptionDefault
page_idYespage whose share links to list
include_revokedNoalso include revoked links (default: active only)

Output Schema

NameRequiredDescription
sharesYes

TDQS

A4/5.0
Behavior4/5

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

Adds important context beyond annotations: active-only default, revoked links optional, and requires write-scoped key due to bearer secrets. Discloses returned fields.

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 purpose, no waste. Efficient and well-structured.

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?

Output schema exists and annotations present. Description covers purpose, parameters, and key security requirement; complete for a listing tool.

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 100%, but description adds meaning to include_revoked (default behavior) and clarifies page_id context (page's share links).

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?

Clearly states verb 'List' and resource 'page's public share links' with scope (editor+). No explicit sibling differentiation, but the purpose is distinct from share_page and revoke_share.

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?

Provides parameter usage (include_revoked), but no explicit when-to-use vs alternatives or when-not-to-use.

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

list_space_filesList a space's filesA
Read-only
Inspect

List every file stored in a space, including the ones parented to the space ROOT rather than to a page — those are invisible to list_attachments (which is per-page), so this is the only way to discover a file that was synced or imported beside the page tree. Each entry carries the same links: download_url for the bytes, share_url to give a person, plus parent_page_id/parent_title (absent = the space root). Filter with parent_page_id: a page id for that page's files, "root" for the root only. Read-only; any space role. Capped at 500 files (truncated says so).

NameRequiredDescriptionDefault
space_idYesspace whose files to list
parent_page_idNooptional filter: a page id for that page's files, or "root" for files parented to the space root; omit for every file in the space

Output Schema

NameRequiredDescription
filesYes
truncatedNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint, destructiveHint=false), and the description layers on context annotations cannot express: required authorization level ("any space role"), a hard result cap of 500 files with a `truncated` signal for detecting truncation, and the shape of each entry including which fields are optional.

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?

Front-loaded with purpose and sibling differentiation, then payload shape, then filter syntax, then limits — a logical order with no filler sentences. It is dense and packs several clauses per sentence, which is justified by the information delivered but leaves little breathing room.

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?

An output schema exists, yet the description still names the meaningful return links (download_url, share_url, parent_page_id/parent_title) and the truncation flag, so an agent knows both what it gets and when output is partial. For a two-parameter read tool with full annotation and schema coverage, nothing material is missing.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3, but the description adds real semantics beyond the schema: the "absent = space root" convention on parent_page_id/parent_title, and the reserved literal "root" as a filter value. It stops short of documenting space_id behavior, but the incremental value over the schema is genuine.

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?

Opens with a specific verb+resource ("List every file stored in a space") and immediately scopes it against the closest sibling, list_attachments, naming the exact class of files only this tool can surface (root-parented, synced/imported). An agent can route between the two without opening 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 Guidelines5/5

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

Explicit when-to-use ("the only way to discover a file that was synced or imported beside the page tree") and when-not ("invisible to list_attachments, which is per-page"), plus a concrete filtering recipe for parent_page_id. Nothing is left to inference.

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

list_spacesList spacesA
Read-only
Inspect

List every space the API key can access (id, name, slug). Read-only. Start here to discover a space_id for list_pages / search / create_page when you don't already have one; for a single space you already know, use get_space instead.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
spacesYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and destructiveHint. Description adds that it returns id/name/slug for all accessible spaces. No further behavioral details needed for this simple tool.

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 concise sentences. First states purpose and return fields, second provides usage guidance. No waste.

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

Completeness5/5

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

For a zero-parameter tool with annotations and output schema, the description covers purpose, return content, and when to use it, making it fully adequate.

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?

No parameters, so baseline score of 4 applies. No need for additional parameter context.

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 it lists all accessible spaces, returning id/name/slug, and is read-only. Clearly distinguishes from get_space for single known spaces.

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 advises to start here for discovering a space_id before using list_pages/search/create_page, and recommends get_space for a single known space.

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

move_pageMove pageA
Idempotent
Inspect

Move a page: reparent (parent_id), detach to top-level (make_root), reorder (position), and/or relocate to another space (space_id). Editor+ in both source and target space. Provide at least one of space_id / parent_id / make_root / position.

NameRequiredDescriptionDefault
idYespage to move
positionNonew 0-based position among siblings (omit to keep)
space_idNorelocate to this space (omit to keep)
make_rootNodetach to top-level (mutually exclusive with parent_id)
parent_idNonew parent page id (omit to keep; mutually exclusive with make_root)

Output Schema

NameRequiredDescription
pageYes

TDQS

A3.9/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 the safety profile is covered. The description adds value beyond that: the dual-space Editor+ permission requirement (source AND target) and the mutual exclusivity between make_root and parent_id — neither is in the annotations.

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. The move semantics and their parameter mappings come first, and the constraint follows immediately. Every clause carries information.

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 5-parameter mutation tool with an output schema in place, the description covers the operation set, permissions, and the at-least-one-parameter rule, so nothing critical is missing. It could still be richer about what happens to existing children or ordering when space_id changes, but the output schema and annotations absorb most of that burden.

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 100%, so the baseline is 3 and the schema already documents each parameter's meaning. The description adds a constraint not encoded in the schema — that at least one of the four movement parameters must be supplied — which meaningfully guides correct invocation.

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 (move) plus the four distinct sub-operations (reparent, detach, reorder, relocate) and maps each to its parameter, so the agent understands the exact scope. It stops short of naming how it differs from siblings like update_page or patch_page, which also mutate pages.

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 states a real prerequisite (Editor+ in both source and target space) and a call constraint ('provide at least one of space_id / parent_id / make_root / position'), which is genuinely useful. However, it never says when to prefer move_page over update_page or patch_page, so the routing decision remains implicit.

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

patch_pagePatch page sectionAInspect

Surgically edit ONE section of a page instead of rewriting the whole body (editor+). First call get_page format:"map" to see the section paths, then patch the target. Cheaper and safer than update_page on a long page — it never touches the rest of the document. Snapshots a revision like any edit.

NameRequiredDescriptionDefault
idYespage id to patch
targetYesthe section to edit, by its heading path from get_page format:"map" (e.g. 'Setup' or 'Deploy > Production'); the bare heading text also resolves
contentNomarkdown to insert; omit for delete
operationYesappend (add to the end of the section's body), prepend (add right under the heading), replace (swap the section's body, heading kept), or delete (remove the heading and its body). A section means the heading AND EVERYTHING NESTED UNDER IT until the next same-or-higher heading — so replace/delete on a '##' also removes its '###' sub-sections (they come back in the response as removed_subsections), and append lands after the last of them. To edit only the prose under a heading that has sub-sections, target the sub-section instead.
base_versionNooptional: the page version you last read. If the page has changed since, the patch is refused with version_conflict; re-read and reapply. Even without it, a patch never overwrites an edit made while it was being applied
idempotency_keyNooptional client-generated key; a retry with the same key returns the original result instead of re-applying the patch

Output Schema

NameRequiredDescription
pageYes
warningNo
removed_subsectionsNo

TDQS

A4.9/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: the permission requirement ('editor+'), the isolation guarantee ('never touches the rest of the document'), and the side effect ('Snapshots a revision like any edit'), which also implies edits are recoverable. This is meaningful behavioral disclosure for a mutation tool whose annotations only give the readOnly/destructive flags.

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 scope claim, then the required workflow, then the comparative justification. The parenthetical '(editor+)' packs a permission requirement into two tokens; no sentence is wasted.

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?

An output schema exists, so return values need no explanation, and the full-coverage parameter schema handles the input details. The description covers the remaining gaps an agent needs: permission level, workflow ordering, side effects, and comparison to the sibling tool.

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 procedural meaning to the 'target' parameter by tying it to the get_page format:"map" workflow. It does not add syntax detail for content, operation, base_version, or idempotency_key beyond what the schema already documents.

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 ('surgically edit ONE section of a page') and immediately scopes it against the whole-body alternative ('instead of rewriting the whole body'), naming update_page and get_page so the agent can differentiate from siblings without opening schemas.

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?

Gives explicit when-to-use ('instead of rewriting the whole body'), names the alternative tool and the condition that favors it ('cheaper and safer than update_page on a long page'), and states a prerequisite workflow ('First call get_page format:"map" ... then patch the target'). Nothing is left to inference.

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

preview_deckPreview slide deckA
Read-only
Inspect

Render a deck page to slide images and return them, so you can SEE how the deck looks (don't author blind). Pass slides to preview specific 1-based frames; omit for the first few. Renders are cached.

NameRequiredDescriptionDefault
idYesid of the deck page to render and preview
slidesNooptional 1-based frame numbers to preview; omit for the first few

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 and destructiveHint=false, indicating a safe read operation. The description adds valuable behavioral context: 'Renders are cached', which is not in annotations. No contradictions.

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

Conciseness5/5

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

Three sentences: purpose, parameter usage, and caching behavior. Every sentence adds value and is front-loaded. No unnecessary words.

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?

Given the tool's simplicity (2 params, no output schema), the description covers purpose, parameter usage, and caching. It could be improved by describing the return format (e.g., list of image URLs), but is mostly complete.

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 both parameters have clear descriptions in the schema. The description repeats the slides parameter guidance but adds no new meaning beyond the schema. Baseline 3 is appropriate.

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 clearly states the tool's purpose: 'Render a deck page to slide images and return them'. It distinguishes from sibling tools like 'generate_deck_image' by emphasizing visual preview ('so you can SEE how the deck looks') and advising not to author blind.

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 provides clear context: use to see how the deck looks before authoring. It gives parameter guidance ('Pass slides to preview specific 1-based frames; omit for the first few') but does not explicitly mention when not to use or compare with alternatives.

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

preview_pagePreview pageA
Read-only
Inspect

Render a page and read it back as the reader actually shows it — the same render the PDF export uses, so callouts, tables, math, mermaid and diagrams are all resolved. Use it to check that what you wrote is what appears (text you can diff against your intent), and after any edit whose result you can't be sure of from the markdown alone. format: "text" (default), "image" for a screenshot, "both". For a deck page, call preview_deck instead.

NameRequiredDescriptionDefault
idYesid of the page to render and read back
formatNotext (default) returns the rendered page as plain text — enough to catch prose that the renderer swallowed or reordered; image returns a screenshot of the reader; both returns each

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior: it is the same render used by PDF export, and callouts, tables, math, mermaid and diagrams are resolved, plus what each format value returns. It stops short of noting render cost, latency, or output size for image/both, which is a minor gap.

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?

Front-loads the core purpose, then usage, then parameter semantics, then the sibling routing note — a sensible ordering with little waste. The dense em-dash clauses make it slightly heavier than necessary, but every sentence carries distinct 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?

There is no output schema, so the description carries the return-value burden, and it does: text reads the page back as plain text, image returns a screenshot, both returns each. Combined with the routing note and render-behavior context, an agent has everything needed to call it correctly.

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 goes beyond the schema by explaining the intent of each format value ('text ... enough to catch prose that the renderer swallowed or reordered'). It also confirms the default, which the schema states more tersely.

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+resource ('render a page and read it back as the reader actually shows it') with the key differentiator that it uses the same render pipeline as PDF export. It explicitly names the sibling it is not for deck pages ('call preview_deck instead'), letting an agent disambiguate 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 Guidelines5/5

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

Gives concrete when-to-use conditions: verifying that written content renders as intended, and re-checking after any edit whose result can't be inferred from markdown alone. It also supplies the negative case (deck pages → preview_deck), so routing is fully determined.

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

read_chunkRead chunkA
Read-only
Inspect

Fetch one chunk's full section text by chunk_id (from a research source), for a page OR a file chunk (read-only). Middle granularity — use it to expand a single cited section; for the whole page use get_page. A file chunk cites its file (file_name + parent page_id + download_url for the bytes + share_url, the previewable link to show a person).

NameRequiredDescriptionDefault
chunk_idYeschunk id from a research result

Output Schema

NameRequiredDescription
chunkYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false), so the bar is lower. The description adds real context beyond that: it works on both page and file chunks, and it names the file-chunk citation fields (file_name, parent page_id, download_url, share_url) an agent will encounter. It does not discuss error cases or missing-chunk behavior, keeping it short of a 5.

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

Conciseness4/5

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

Three sentences, front-loaded with the core purpose and the granularity/alternative rule before the file-chunk detail. The parenthetical file-citation list is dense but earns its place as invocation-relevant context; slight wordiness keeps it from a 5.

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?

An output schema exists, so return values need not be explained, and the description still covers granularity, the alternative tool, the source constraint, and the file-chunk case. For a one-parameter read tool this is complete enough to call correctly.

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?

There is a single parameter and schema description coverage is 100%, so the schema already documents chunk_id fully. The description's phrase 'from a `research` source' roughly restates the schema's 'chunk id from a research result' and adds no format or sourcing detail beyond it. Baseline 3 is appropriate.

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+resource ('Fetch one chunk's full section text by chunk_id') and pins down the scope ('for a page OR a file chunk'). It also explicitly distinguishes itself from get_page ('Middle granularity... for the whole page use get_page'), so an agent can route correctly without opening 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 Guidelines5/5

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

Gives an explicit when-to-use ('expand a single cited section'), an explicit when-not/alternative ('for the whole page use get_page'), and a source precondition ('from a `research` source'). Nothing about selection is left to inference.

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

request_attachment_uploadRequest a direct upload URLAInspect

Get a short-lived signed PUT URL to upload a file WITHOUT sending its bytes through the model context — for files over upload_attachment's 5 MB inline cap, or to avoid context bloat. Flow: call this → the host PUTs the raw bytes to the returned put_url over HTTP → then either read that PUT response or call confirm_attachment_upload to get the embed snippet (and share_url, the link for a person), and place it with update_page/patch_page. Editor+. Only works on hosts that can make an outbound HTTP PUT; otherwise use upload_attachment.

NameRequiredDescriptionDefault
mimeNooptional content-type hint; for images the server still trusts magic bytes
nameYesfile name including extension, e.g. deck.pdf or photo.png
page_idYespage to attach the file to

Output Schema

NameRequiredDescription
uploadYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnly=false, destructive=false, openWorld=false). The description goes well beyond them: the URL is short-lived, bytes never traverse model context, the exact call sequence (this → host PUT → read response or confirm_attachment_upload), the permission level, and the host's outbound-PUT requirement.

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?

Front-loads the purpose and constraint before the flow, and every clause carries information (limits, ordering, alternatives, prerequisites). It is dense and runs long as a single block, but nothing is wasted.

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 an output schema present, return values need no prose explanation. The description still supplies everything an agent needs to act correctly: prerequisites, sequencing, the follow-up tool, and where the resulting snippet goes (update_page/patch_page).

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 three parameters (name, page_id, mime) are already documented in the schema. The description references put_url/share_url, which are outputs rather than inputs, and adds no syntax or format detail for the parameters themselves. Baseline 3 is appropriate.

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 ('Get a short-lived signed PUT URL to upload a file') and immediately differentiates itself from the sibling upload_attachment by the 5 MB inline cap and context-bloat rationale. An agent can distinguish it from upload_attachment and confirm_attachment_upload 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 Guidelines5/5

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

Explicit selection criteria: use this for files over upload_attachment's 5 MB inline cap or to avoid context bloat. It also names the fallback ('otherwise use upload_attachment') and the host capability prerequisite, plus the Editor+ requirement.

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

researchResearch the wikiA
Read-only
Inspect

Answer a question — or gather everything relevant on a topic — from the wiki by MEANING. One call assembles answer-ready grounding: the full bodies of the pages that matter (not isolated fragments), pulled from pages AND attached files (PDFs, docs), plus any flagged disagreements among the sources and a low_confidence signal. Returns context (a numbered [n] excerpt block to ground your answer), sources (the cited hits aligned to [n], each with page_id/chunk_id for drill-in and, for file sources, a download_url for the bytes plus a share_url to show the person), disagreements (conflicts to surface, [n]-keyed), low_confidence, and considered/truncated. truncated: true means retrieval found MORE relevant sources than it returned (considered says how many) — the corpus did not run out, the per-call cap did; re-ask with a bigger limit before concluding anything is missing. YOU write the answer from context and cite sources by their [n]. To read one section deeper use read_chunk (chunk_id from a source) or get_page (full page). For exact-name/term lookup use search. Requires a configured embedder (503 otherwise).

NameRequiredDescriptionDefault
limitNomax sources to return (default 12, max 40) — raise it when a result comes back truncated
questionYesthe question to answer, or topic to gather context on
space_idNooptional space id to restrict retrieval to

Output Schema

NameRequiredDescription
contextYes
sourcesYes
truncatedYes
consideredYes
disagreementsNo
low_confidenceYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnly, non-destructive, closed-world), and the description adds substantial behavioral context beyond them: full bodies rather than fragments, coverage of pages and attached files, surfaced `disagreements` and `low_confidence`, and critically the meaning of `truncated: true` (per-call cap, not exhausted corpus). The embedder/503 dependency is a valuable non-obvious runtime trait.

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?

Front-loads purpose before going into return shape and drill-in routing, and most sentences are functional (truncation semantics, prerequisite, citation by [n]). It is dense and slightly over-enumerates return keys (`context`, `sources`, `disagreements`, `considered`), some of which duplicate the output schema, but the overall organization is purposeful.

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 an output schema present, return-value explanation is optional, yet the description still supplies the semantics an agent needs: how to cite ([n]), how to drill in (chunk_id/download_url/share_url), and how to interpret `truncated`. Combined with the embedder prerequisite and sibling routing, nothing necessary for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents `question`, `space_id` and `limit` (default 12, max 40). The description nonetheless adds actionable semantics for `limit` — raise it before concluding anything is missing when `truncated` is true — which links the parameter to observed behavior rather than just restating its bounds.

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+resource+mechanism: answer/gather on the wiki "by MEANING," with the scope (full page bodies, pages AND attached files) made explicit. It cleanly distinguishes itself from siblings by naming `search` as exact-term lookup and positioning itself as the semantic alternative.

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

Usage Guidelines5/5

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

Explicit routing: use this when you need answer-ready grounding, `read_chunk` to read one section deeper, `get_page` for a full page, `search` for exact-name/term lookup. It also states the operational prerequisite — a configured embedder is required (503 otherwise) — and tells the agent how to react to truncation.

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

revoke_shareRevoke share linkA
DestructiveIdempotent
Inspect

Disable a public share link by its share id (editor+; ids come from list_shares). The link stops working immediately. Idempotent — revoking an already-revoked link is a no-op.

NameRequiredDescriptionDefault
share_idYesid of the share link to revoke (from list_shares)

Output Schema

NameRequiredDescription
okYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate destructive and idempotent behavior. Description adds valuable context: immediate effect ('stops working immediately') and confirms idempotency as a no-op. No contradictions.

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 wasted words. Front-loaded with the action, followed by key details and idempotency note. Excellent structure.

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

Completeness5/5

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

For a simple tool with one required parameter and an output schema, the description covers all essential aspects: purpose, effect, safety (idempotent), and parameter source. No gaps.

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?

Only one parameter with 100% schema coverage. Description adds meaning by specifying source of share_id (from list_shares) and access level (editor+), going beyond the schema definition.

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?

Clearly states the action (disable/revoke), resource (public share link), identification method (by share id from list_shares), and immediate effect. Distinguishes itself from sibling tools like list_shares.

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?

Provides context on when to use (to revoke a share link) and mentions prerequisite (ids from list_shares). Does not explicitly state when not to use or alternatives, but the intent is clear.

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

share_pageShare page (public link)AInspect

Mint a public share link for a page — a URL anyone can open with NO tela login (editor+). Returns the absolute url plus the link's id and token. Options: include_descendants shares the whole subtree (not just this page); password gates it behind a passphrase; expires_at (UTC 'YYYY-MM-DD HH:MM:SS') auto-expires it. Each call mints a NEW link — use list_shares to see existing ones and revoke_share to disable one. This shares a single page tree; to publish a WHOLE space, use the space's visibility setting instead.

NameRequiredDescriptionDefault
page_idYespage to mint a public link for
passwordNogate the link behind a passphrase (omit for open access)
expires_atNoauto-expire at this UTC 'YYYY-MM-DD HH:MM:SS' (omit for no expiry)
include_descendantsNoshare the whole subtree, not just this page

Output Schema

NameRequiredDescription
shareYes

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations, it discloses that each call mints a new link, explaining idempotency. It also describes return values and options. No contradiction with annotations.

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?

Concise paragraph with no fluff. Front-loaded with purpose, then options, then behavior, then comparisons. Each sentence is essential.

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?

Covers purpose, parameters, return values, behavior, and relations to other tools. Complete for a mutation tool with good annotations.

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

Parameters5/5

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

Schema coverage is 100%, but description adds context: include_descendants shares subtree, password gates behind passphrase, expires_at format and behavior. Adds value beyond schema.

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

Purpose5/5

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

The description clearly states 'Mint a public share link for a page' with specific verb and resource. It distinguishes from sibling tools like list_shares and revoke_share.

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 says when to use this tool (sharing a page tree) and when not to (for a whole space, use space visibility setting). Mentions alternatives like list_shares and revoke_share.

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

sheet_authoring_guideSheet authoring guideA
Read-only
Inspect

Return the full tela spreadsheet (sheet) authoring guide as markdown — the Defter text format, coordinates, the formula functions, and the ```defter-style styling/format/chart syntax. Read this FIRST when creating or editing a sheet (a sheet=true page) so you write valid, well-formatted Defter markdown instead of guessing.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
guideYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description adds value by specifying the returned content (markdown guide). It does not contradict annotations and provides sufficient behavioral context.

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: first states what it returns, second states when to use it. No fluff, front-loaded with key 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?

Given the tool's simplicity (no parameters, output schema exists), the description is fully complete. It explains what, when, and why, with no gaps.

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?

No parameters exist (0 params, schema coverage 100%). The description correctly adds no parameter info, as none are needed. Baseline 4 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 clearly states it returns the full sheet authoring guide as markdown, listing specific content (Defter text format, coordinates, formulas, syntax). It also gives a usage instruction: read this first when creating/editing a sheet. This distinguishes it from action-oriented siblings like edit_sheet.

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 says 'Read this FIRST when creating or editing a sheet' and advises against guessing. This tells the agent exactly when to use this tool and provides context for sequence of operations.

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

submit_feedbackSubmit feedbackAInspect

Submit free-text feedback about tela / tela-mcp itself (friction, bugs, missing capabilities). NOT for page content — use add_comment for that.

NameRequiredDescriptionDefault
bodyYesfeedback body (1-8000 chars)
kindNooptional type: idea | bug | other
subjectYesshort subject (1-200 chars)

Output Schema

NameRequiredDescription
feedbackYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already indicate this is a mutation (readOnlyHint=false) but not destructive. The description adds the scope constraint but does not disclose additional behaviors such as confirmation, rate limits, or side effects beyond the basic submission action.

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 purpose and exclusions are front-loaded, making it easy for an agent to quickly understand scope.

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?

Given the presence of an output schema and full parameter descriptions, the description covers the essential context: what to submit and what not, with no missing information for correct agent 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 coverage is 100%, so the description does not need to detail parameters. It does not add any extra semantics beyond what the schema already provides for subject, body, and kind.

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 clearly states the tool submits free-text feedback about the tool itself, distinguishing it from page content feedback. It explicitly names a sibling tool (add_comment) for the alternative use case.

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 explicit guidance on when to use (feedback about tela/tela-mcp) and when not to use (page content), with a direct reference to add_comment as the appropriate alternative.

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

treat_deck_imageTreat deck imageAInspect

Make an image tahta-grade for a deck's variant (editor+): crop to 16:9, apply a scheme-aware duotone (palette-lock), grain, and an optional contrast scrim. Upload the source with upload_attachment first, then pass its attachment_id; the treated JPEG is saved as a new attachment and returned with a ready-to-place snippet for a bg:/image: slot. This is the tahta-imagine treat step — a FALLBACK for off-palette or reused images; prefer rich on-palette images raw, and never duotone (mode=duotone) a real-colour focal subject — use mode=none for those. See the imagery capability module (deck_authoring_guide module="imagery").

NameRequiredDescriptionDefault
idYesid of the deck page the source image is attached to (the treated result is attached here too)
modeNoduotone (palette-lock to the variant, default) or none (crop+grain only, keep the image raw)
scrimNooptional contrast scrim: left or bottom (for text over the image); omit for none
variantNotahta variant to treat for; omit to use the deck's own variant
attachment_idYesid of an existing attachment ON THIS PAGE to treat (upload the source first with upload_attachment)

Output Schema

NameRequiredDescription
urlYes
noteYes
variantYes
markdownYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false. The description adds critical context: it modifies the image and saves a new attachment, returns a snippet, and warns against duotone on real-colour subjects. This goes beyond annotations, but annotations already establish mutability.

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?

Description is a single dense paragraph, efficient but packed with information. Could be slightly more structured (e.g., bullet points), but it front-loads the main action and follows with guidelines. No wasted words.

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?

Given the tool's complexity (5 params, prerequisite step, output snippet), the description covers all essential aspects: prerequisites, process, output format, and reference to the imagery module. The presence of an output schema reduces the need to detail return values.

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 covers 100% of parameters. Description clarifies relationships (e.g., variant defaults to deck's own) and adds context for mode, scrim, and the required upload step. It enhances the schema without repeating it verbatim.

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 clearly states the tool transforms an image into 'tahta-grade' by cropping to 16:9, applying duotone, grain, and optional scrim. It distinguishes itself from siblings like generate_deck_image and upload_attachment by its specific role as a fallback treat step.

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 when to use: 'FALLBACK for off-palette or reused images' and when not: 'prefer rich on-palette images raw'. Provides prerequisite: upload with upload_attachment first. Names alternatives: use mode=none for real-colour subjects.

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

update_commentUpdate commentA
Idempotent
Inspect

Edit or resolve an existing comment (editor+); pass exactly one of body / resolved. {resolved: true} closes a thread once you have acted on it, {resolved: false} reopens one — idempotent, so re-resolving an already-resolved comment succeeds instead of erroring. Resolve applies to ROOT comments only. {body: ...} rewrites the text and is author-only: it works on comments this key wrote, and is refused on a person's comment. To answer someone rather than close them out, use add_comment with parent_id.

NameRequiredDescriptionDefault
bodyNonew comment text (author-only; refused on someone else's comment)
resolvedNotrue closes a root thread, false reopens it
comment_idYesid of the comment to update

Output Schema

NameRequiredDescription
commentYes

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the idempotency semantics concretely ('re-resolving an already-resolved comment succeeds instead of erroring'), the scope limit ('Resolve applies to ROOT comments only'), and the authorization boundary ('author-only: it works on comments this key wrote, and is refused on a person's comment'). These are behavioral facts the structured hints could not 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?

Front-loaded purpose followed by mode-specific guidance using concrete literal examples ({resolved: true} / {body: ...}). Every sentence carries operational information; there is no filler.

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?

An output schema exists, so return values need not be described. With permissions, exclusivity, scope limits, idempotency, and sibling routing all covered, an agent has everything needed to invoke this tool correctly.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds a constraint absent from the schema: body and resolved are mutually exclusive ('pass exactly one of body / resolved'). It also enriches each parameter's meaning with root-only scope and the author-only refusal rule, which is more than the schema's terse descriptions provide.

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?

Opens with a specific verb+resource ('Edit or resolve an existing comment') and immediately scopes it with the required permission level ('editor+'). It is unmistakably distinct from add_comment and list_comments in the sibling set.

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 selection rule ('pass exactly one of body / resolved'), explains the intent of each mode, and routes the alternative case to a named sibling ('To answer someone rather than close them out, use add_comment with parent_id'). This is exactly the when/when-not/alternative guidance the dimension asks for.

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

update_pageUpdate pageA
Idempotent
Inspect

Patch a page's title, body, props and/or draft status (editor+). A body change auto-snapshots a revision. Pass base_version (from get_page) to refuse the write if someone edited the page since you read it. tela renders a rich block palette beyond plain markdown — to-do list, pull quote, callout, collapsible, tabs, kanban board, stat grid, timeline, calendar, poll, chart, embed, mermaid diagram, image, file attachment, code block, equation, inline math, table, highlight, wikilink, footnote. Prefer these over walls of text; read the tela://authoring-guide resource (or this server's instructions) for exact syntax. After writing, call lint_page — the reader silently drops raw HTML and unwraps unrecognized blocks, which you cannot see from the markdown. When asked for a presentation, slides, a slide deck, or a talk (any phrasing) — not a prose doc — set the page property deck=true (and optionally variant=) and write the body as slides separated by --- using the tahta layouts; call the deck_authoring_guide tool (or read the tela://deck-authoring-guide resource) for the layouts, fields, components, and variants. When asked for a spreadsheet, a table of data with formulas/totals, a budget, a tracker, or any grid that computes — not a prose doc — set the page property sheet=true and write the body as Defter markdown (compact GFM tables + an optional ```defter-style block); call the sheet_authoring_guide tool (or read the tela://sheet-authoring-guide resource) for the format, formulas, and styling.

NameRequiredDescriptionDefault
idYespage id to patch
bodyNonew markdown body (omit to leave unchanged)
propsNoreplace the whole properties bag (omit to leave unchanged); reserved keys are ignored
titleNonew title (omit to leave unchanged)
statusNo'draft' or 'published' (omit to leave unchanged). Publishing a draft makes it eligible for public spaces and share links
base_versionNooptional: the page version you last read (get_page returns it). If the page has changed since, the write is refused with version_conflict instead of overwriting that edit; re-read and reapply. Omit for last-write-wins

Output Schema

NameRequiredDescription
lintNo
pageYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already mark this as non-readOnly, idempotent, non-destructive, but the description adds behavior beyond them: a body change auto-snapshots a revision, base_version triggers a version_conflict refusal rather than overwriting, editor+ permission is required, and the reader silently drops raw HTML / unwraps unrecognized blocks. These are concrete consequences an agent needs before invoking.

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

Conciseness3/5

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

The core action and the highest-value guidance (revision snapshot, base_version conflict, lint_page) are front-loaded, which is good. But the long enumerations of block palette items and the deck/sheet instructions are verbose, and the description itself points to the tela:// resources for the details, so this content partially duplicates what those resources hold. It is serviceable but not tight.

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?

An output schema exists, so return values need not be explained. Given a 6-parameter, nested-object mutation tool, the description covers permissions, idempotency/conflict handling, post-write validation, and the special deck/sheet modes. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description still adds meaning beyond the schema by tying base_version to get_page as the source of the value, and by revealing that props carries reserved keys like deck and sheet that switch authoring modes. That is genuine parameter semantics not present in 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 first sentence gives a specific verb + resource + field set: 'Patch a page's title, body, props and/or draft status (editor+).' That is unambiguous about what the tool does. However, the sibling list contains patch_page, and the description never distinguishes update_page from it, so an agent cannot cleanly route between the two from this text alone.

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?

The description gives explicit when-to-use routing: use base_version to detect concurrent edits, call lint_page after writing, and set deck=true vs sheet=true depending on whether the request is for a presentation/deck vs a spreadsheet/grid. It also names the alternatives (deck_authoring_guide, sheet_authoring_guide, the tela:// resources) and the condition that selects each. This is exactly the kind of decision guidance the dimension rewards.

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

update_spaceUpdate spaceA
Idempotent
Inspect

Patch a space's name and/or slug (editor+); idempotent — pass only the field(s) you want to change. Changing the slug updates the space's URL path (existing page ids and links still resolve). To create a space use create_space, to read it use get_space, to remove it use delete_space.

NameRequiredDescriptionDefault
idYesspace id to patch
nameNonew name (omit to leave unchanged)
slugNonew slug (omit to leave unchanged)

Output Schema

NameRequiredDescription
spaceYes

TDQS

A4.5/5.0
Behavior4/5

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

Adds real context beyond the annotations: the 'editor+' authorization requirement, the partial-update contract ('pass only the field(s) you want to change'), and the non-obvious side effect that a slug change rewrites the URL path while existing page ids and links still resolve. It does repeat the idempotentHint from annotations, so it is not fully additive, but the slug/URL and auth disclosures are valuable.

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?

Front-loaded with the core action and constraint, then the alternative-tool routing; every clause carries information and there is no filler.

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?

An output schema exists, so return-value documentation is unnecessary, and the description still covers authorization, partial-update behavior, slug side effects, and sibling routing. Nothing needed to invoke the tool 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 id, name, and slug are already documented, including the 'omit to leave unchanged' semantics the description restates. Baseline 3 is appropriate since the description adds no syntax, format, or validation detail beyond the schema.

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

Purpose5/5

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

States a specific verb ('Patch') and resource ('a space's name and/or slug') plus the permission tier, so an agent can distinguish it from create_space, get_space, and delete_space 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 Guidelines5/5

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

Explicitly names the three sibling alternatives (create_space, get_space, delete_space) and their respective operations, giving the agent a complete routing map for the space lifecycle.

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

upload_attachmentUpload attachmentAInspect

Upload a file (base64) and attach it to a page (editor+) — an image, PDF, dataset, etc. Returns the serve URL plus a ready-to-paste markdown snippet; then call update_page or patch_page to place it in the body (images render inline as , other files as a download card). It also returns share_url — the link to give a PERSON who asks for the file, since it previews it and unfurls as a card, unlike the raw download_url. The payload is inline base64 and rides through the model's context, so it is capped at 5 MB — keep it to small files (screenshots, charts, short PDFs). For larger files use request_attachment_upload (a direct PUT URL, bytes off-context), or the tela editor (drag-drop).

NameRequiredDescriptionDefault
nameYesfile name including extension, e.g. report.pdf or chart.png (drives the displayed name + type detection)
page_idYespage to attach the file to
data_base64Yesthe file bytes, base64-encoded; a leading data:<mime>;base64,… URL prefix is also accepted

Output Schema

NameRequiredDescription
attachmentYes

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations (which only say this is a non-destructive write). It discloses the 5 MB cap and why it exists (base64 rides through model context), what the call returns (serve URL, markdown snippet, share_url), and the behavioral distinction between share_url (previewable, unfurls as a card, for people) and raw download_url — exactly the kind of context an agent cannot get from structured fields.

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?

Purpose and the update_page/patch_page follow-up come first, then return semantics, then the size constraint and alternatives. Every clause carries information — permission level, cap rationale, share vs download URL, fallbacks — with no filler.

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 full-schema parameters, annotations covering the safety profile, and an output schema handling return shape, the description fills the remaining gaps: permission requirement, size ceiling, returned artifacts, and the downstream workflow. Nothing an agent needs to invoke this 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 coverage is 100%, so name/page_id/data_base64 are already fully documented, including the accepted data:URL prefix. The description adds only the 'base64, ~5MB' framing and the downstream use of the payload, so the baseline 3 is appropriate.

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+resource ('Upload a file (base64) and attach it to a page') and immediately scopes it with the required permission level (editor+). It is clearly distinguishable from the sibling upload tools (request_attachment_upload, confirm_attachment_upload) because it names them explicitly.

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?

Gives an explicit when-to-use with a concrete size threshold ('keep it to small files (screenshots, charts, short PDFs)') and names the alternatives for the excluded case: request_attachment_upload for larger files and the tela editor drag-drop. It also states the required follow-up step (call update_page or patch_page to place it).

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. 28 tool updatesv0.11.0
    • Changedadd_comment4 fields changed
      • changedInput schema / properties / anchor / description
        Previous value: -"text-quote anchor locating the comment in the body"New value: +"text-quote anchor locating the comment in the page's PLAIN TEXT (markdown markers stripped); required for a root comment, omit when replying"
      • changedInput schema / properties / anchor / type
        Previous value: -"object"New value: +[
        +  "null",
        +  "object"
        +]
      • addedInput schema / properties / parent_id
        Added value: +{
        +  "description": "id of the root comment to reply to; omit to start a new thread",
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • changedInput schema / required
        Previous value: -[
        -  "page_id",
        -  "anchor",
        -  "body"
        -]New value: +[
        +  "page_id",
        +  "body"
        +]
    • Changedatlas_list_projects2 fields changed
      • addedOutput schema / properties / projects / items / properties / unreachable_sources
        Added value: +{
        +  "type": "integer"
        +}
      • changedOutput schema / properties / projects / items / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "owner",
        -  "output_space",
        -  "cadence",
        -  "auto_update",
        -  "sources_count",
        -  "stale_sources",
        -  "last_run",
        -  "created_at",
        -  "can_manage",
        -  "scheduled_allowed"
        -]New value: +[
        +  "id",
        +  "name",
        +  "owner",
        +  "output_space",
        +  "cadence",
        +  "auto_update",
        +  "sources_count",
        +  "stale_sources",
        +  "unreachable_sources",
        +  "last_run",
        +  "created_at",
        +  "can_manage",
        +  "scheduled_allowed"
        +]
    • Changedconfirm_attachment_upload3 fields changed
      • addedOutput schema / properties / attachment / properties / share_path
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / attachment / properties / share_url
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / attachment / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "mime",
        -  "byte_size",
        -  "hash",
        -  "url",
        -  "embedded",
        -  "download_url",
        -  "markdown"
        -]New value: +[
        +  "id",
        +  "name",
        +  "mime",
        +  "byte_size",
        +  "hash",
        +  "url",
        +  "share_path",
        +  "embedded",
        +  "download_url",
        +  "share_url",
        +  "markdown"
        +]
    • Changedcreate_page5 fields changed
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "optional: 'draft' (work in progress: labelled in the app and kept off public spaces and share links) or 'published' (the default)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / lint
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / page / properties / status
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / page / properties / version
        Added value: +{
        +  "type": "integer"
        +}
      • changedOutput schema / properties / page / required
        Previous value: -[
        -  "id",
        -  "space_id",
        -  "parent_id",
        -  "title",
        -  "position",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "space_id",
        +  "parent_id",
        +  "title",
        +  "position",
        +  "created_at",
        +  "updated_at",
        +  "version",
        +  "status",
        +  "url"
        +]
    • Changedcreate_space1 field changed
      • addedOutput schema / properties / space / properties / public_path
        Added value: +{
        +  "type": "string"
        +}
    • Changededit_sheet5 fields changed
      • addedOutput schema / properties / page / properties / epistemic / properties / summary_stale
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / sections / items / properties / in_quote
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / status
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / page / properties / version
        Added value: +{
        +  "type": "integer"
        +}
      • changedOutput schema / properties / page / required
        Previous value: -[
        -  "id",
        -  "space_id",
        -  "parent_id",
        -  "title",
        -  "body",
        -  "position",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "space_id",
        +  "parent_id",
        +  "title",
        +  "body",
        +  "position",
        +  "created_at",
        +  "updated_at",
        +  "version",
        +  "status",
        +  "url"
        +]
    • Changedget_page5 fields changed
      • addedOutput schema / properties / page / properties / epistemic / properties / summary_stale
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / sections / items / properties / in_quote
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / status
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / page / properties / version
        Added value: +{
        +  "type": "integer"
        +}
      • changedOutput schema / properties / page / required
        Previous value: -[
        -  "id",
        -  "space_id",
        -  "parent_id",
        -  "title",
        -  "body",
        -  "position",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "space_id",
        +  "parent_id",
        +  "title",
        +  "body",
        +  "position",
        +  "created_at",
        +  "updated_at",
        +  "version",
        +  "status",
        +  "url"
        +]
    • Addedget_page_revision
    • Changedget_space1 field changed
      • addedOutput schema / properties / space / properties / public_path
        Added value: +{
        +  "type": "string"
        +}
    • Addedimport_guide
    • Addedinvite_to_space
    • Changedknowledge_gaps4 fields changed
      • addedInput schema / properties / space_id
        Added value: +{
        +  "description": "optional space id to restrict the gaps to",
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedOutput schema / properties / gaps / items / properties / best_score
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / gaps / items / properties / grounded
        Added value: +{
        +  "type": "integer"
        +}
      • changedOutput schema / properties / gaps / items / required
        Previous value: -[
        -  "question",
        -  "asks",
        -  "answered",
        -  "avg_hits",
        -  "last_asked"
        -]New value: +[
        +  "question",
        +  "asks",
        +  "answered",
        +  "grounded",
        +  "avg_hits",
        +  "best_score",
        +  "last_asked"
        +]
    • Addedlint_page
    • Changedlist_attachments3 fields changed
      • addedOutput schema / properties / attachments / items / properties / share_path
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / attachments / items / properties / share_url
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / attachments / items / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "mime",
        -  "byte_size",
        -  "hash",
        -  "url",
        -  "embedded",
        -  "download_url",
        -  "markdown"
        -]New value: +[
        +  "id",
        +  "name",
        +  "mime",
        +  "byte_size",
        +  "hash",
        +  "url",
        +  "share_path",
        +  "embedded",
        +  "download_url",
        +  "share_url",
        +  "markdown"
        +]
    • Addedlist_comments
    • Addedlist_page_revisions
    • Changedlist_pages3 fields changed
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "optional: 'draft' or 'published' to list only pages in that state; omit for all",
        +  "type": "string"
        +}
      • addedOutput schema / properties / pages / items / properties / status
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / pages / items / required
        Previous value: -[
        -  "id",
        -  "space_id",
        -  "parent_id",
        -  "title",
        -  "position",
        -  "url"
        -]New value: +[
        +  "id",
        +  "space_id",
        +  "parent_id",
        +  "title",
        +  "position",
        +  "status",
        +  "url"
        +]
    • Addedlist_space_files
    • Changedmove_page5 fields changed
      • addedOutput schema / properties / page / properties / epistemic / properties / summary_stale
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / sections / items / properties / in_quote
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / status
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / page / properties / version
        Added value: +{
        +  "type": "integer"
        +}
      • changedOutput schema / properties / page / required
        Previous value: -[
        -  "id",
        -  "space_id",
        -  "parent_id",
        -  "title",
        -  "body",
        -  "position",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "space_id",
        +  "parent_id",
        +  "title",
        +  "body",
        +  "position",
        +  "created_at",
        +  "updated_at",
        +  "version",
        +  "status",
        +  "url"
        +]
    • Changedpatch_page9 fields changed
      • addedInput schema / properties / base_version
        Added value: +{
        +  "description": "optional: the page version you last read. If the page has changed since, the patch is refused with version_conflict; re-read and reapply. Even without it, a patch never overwrites an edit made while it was being applied",
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • changedInput schema / properties / operation / description
        Previous value: -"append (add to the end of the section's body), prepend (add right under the heading), replace (swap the section's body, heading kept), or delete (remove the heading and its body)"New value: +"append (add to the end of the section's body), prepend (add right under the heading), replace (swap the section's body, heading kept), or delete (remove the heading and its body). A section means the heading AND EVERYTHING NESTED UNDER IT until the next same-or-higher heading — so replace/delete on a '##' also removes its '###' sub-sections (they come back in the response as removed_subsections), and append lands after the last of them. To edit only the prose under a heading that has sub-sections, target the sub-section instead."
      • addedOutput schema / properties / page / properties / epistemic / properties / summary_stale
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / sections / items / properties / in_quote
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / status
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / page / properties / version
        Added value: +{
        +  "type": "integer"
        +}
      • changedOutput schema / properties / page / required
        Previous value: -[
        -  "id",
        -  "space_id",
        -  "parent_id",
        -  "title",
        -  "body",
        -  "position",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "space_id",
        +  "parent_id",
        +  "title",
        +  "body",
        +  "position",
        +  "created_at",
        +  "updated_at",
        +  "version",
        +  "status",
        +  "url"
        +]
      • addedOutput schema / properties / removed_subsections
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "type": "string"
        +}
    • Addedpreview_page
    • Changedread_chunk1 field changed
      • addedOutput schema / properties / chunk / properties / share_url
        Added value: +{
        +  "type": "string"
        +}
    • Changedresearch5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"optional retrieval depth override (default service-defined)"New value: +"max sources to return (default 12, max 40) — raise it when a result comes back truncated"
      • addedOutput schema / properties / considered
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / sources / items / properties / share_url
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "context",
        -  "sources",
        -  "low_confidence"
        -]New value: +[
        +  "context",
        +  "sources",
        +  "low_confidence",
        +  "considered",
        +  "truncated"
        +]
    • Changedsearch3 fields changed
      • addedOutput schema / properties / results / items / properties / public
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / results / items / properties / public_path
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "page_id",
        -  "space_id",
        -  "title",
        -  "snippet",
        -  "breadcrumb",
        -  "url",
        -  "id",
        -  "text"
        -]New value: +[
        +  "page_id",
        +  "space_id",
        +  "title",
        +  "snippet",
        +  "breadcrumb",
        +  "public",
        +  "url",
        +  "id",
        +  "text"
        +]
    • Addedupdate_comment
    • Changedupdate_page8 fields changed
      • addedInput schema / properties / base_version
        Added value: +{
        +  "description": "optional: the page version you last read (get_page returns it). If the page has changed since, the write is refused with version_conflict instead of overwriting that edit; re-read and reapply. Omit for last-write-wins",
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "'draft' or 'published' (omit to leave unchanged). Publishing a draft makes it eligible for public spaces and share links",
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
      • addedOutput schema / properties / lint
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / page / properties / epistemic / properties / summary_stale
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / sections / items / properties / in_quote
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / status
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / page / properties / version
        Added value: +{
        +  "type": "integer"
        +}
      • changedOutput schema / properties / page / required
        Previous value: -[
        -  "id",
        -  "space_id",
        -  "parent_id",
        -  "title",
        -  "body",
        -  "position",
        -  "created_at",
        -  "updated_at",
        -  "url"
        -]New value: +[
        +  "id",
        +  "space_id",
        +  "parent_id",
        +  "title",
        +  "body",
        +  "position",
        +  "created_at",
        +  "updated_at",
        +  "version",
        +  "status",
        +  "url"
        +]
    • Changedupdate_space1 field changed
      • addedOutput schema / properties / space / properties / public_path
        Added value: +{
        +  "type": "string"
        +}
    • Changedupload_attachment3 fields changed
      • addedOutput schema / properties / attachment / properties / share_path
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / attachment / properties / share_url
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / attachment / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "mime",
        -  "byte_size",
        -  "hash",
        -  "url",
        -  "embedded",
        -  "download_url",
        -  "markdown"
        -]New value: +[
        +  "id",
        +  "name",
        +  "mime",
        +  "byte_size",
        +  "hash",
        +  "url",
        +  "share_path",
        +  "embedded",
        +  "download_url",
        +  "share_url",
        +  "markdown"
        +]
  2. 41 tool updatesv0.1.0
    • First observedadd_comment
    • First observedatlas_list_projects
    • First observedatlas_run
    • First observedatlas_run_status
    • First observedconfirm_attachment_upload
    • First observedcreate_page
    • First observedcreate_space
    • First observeddeck_authoring_guide
    • First observeddelete_attachment
    • First observeddelete_page
    • First observeddelete_space
    • First observededit_sheet
    • First observedfetch
    • First observedfind_overlaps
    • First observedgenerate_deck_image
    • First observedget_page
    • First observedget_space
    • First observedknowledge_gaps
    • First observedlint_deck
    • First observedlist_attachments
    • First observedlist_backlinks
    • First observedlist_pages
    • First observedlist_shares
    • First observedlist_spaces
    • First observedmove_page
    • First observedpatch_page
    • First observedpreview_deck
    • First observedread_chunk
    • First observedrelated_pages
    • First observedrequest_attachment_upload
    • First observedresearch
    • First observedrevoke_share
    • First observedsearch
    • First observedshare_page
    • First observedsheet_authoring_guide
    • First observedsubmit_feedback
    • First observedsuggest_links
    • First observedtreat_deck_image
    • First observedupdate_page
    • First observedupdate_space
    • First observedupload_attachment

TDQS

A3.8/5.0

Scored across 50 tools

Disambiguation4/5

The server has many overlapping retrieval and authoring tools (search/fetch/research/get_page/read_chunk; preview/lint page vs deck), but the descriptions explicitly differentiate each with cross-references and preferred-tool guidance. A few boundaries remain thin, such as fetch vs get_page compatibility aliasing and the multi-step attachment upload flow, so not every tool is instantly separable.

Naming Consistency4/5

Nearly all names are snake_case and many follow a verb_noun pattern (list_pages, create_space, delete_attachment), with a consistent atlas_ prefix for the doc-generation subgroup. The main deviations are noun-phrase guide/utility tools (deck_authoring_guide, knowledge_gaps, fetch), so the convention is readable but not perfectly uniform.

Tool Count1/5

At 50 tools, the surface is far beyond the typical 3-15 well-scoped range and is an extreme mismatch for a single MCP server, even accounting for the broad wiki/deck/sheet/Atlas scope. Several areas could be consolidated, such as the three-step attachment upload flow, separate guide fetches, and fetch/get_page overlap.

Completeness4/5

The surface covers page/space/comment/attachment/share/revision lifecycles plus authoring guides, lint/preview, decks, sheets, research, and Atlas doc generation, which is very broad. A few lifecycle gaps remain, such as no delete_comment, no restore-page operation, and limited attachment metadata editing, so it is not quite a dead-end-free surface.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    This is a connector to allow Claude Desktop (or any MCP client) to read and search any directory containing Markdown notes (such as an Obsidian vault).
    763 npm
    1,352
    AGPL 3.0
  • A
    license
    B
    quality
    A
    maintenance
    Basic Memory is a knowledge management system that allows you to build a persistent semantic graph from conversations with AI assistants. All knowledge is stored in standard Markdown files on your computer, giving you full control and ownership of your data. Integrates directly with Obsidan.md
    38
    17,729 PyPI
    4,402
    AGPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    A token-optimized MCP server for Notion that reduces context window usage by 73% while preserving full functionality, enabling AI assistants to interact with Notion efficiently.
    15 npm
    2
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Self-hosted enterprise knowledge hub that compiles organizational docs into a structured wiki and serves it to AI clients via MCP with fine-grained access control.
    1
    1,498
    -