Skip to main content
Glama

Server Details

Create, edit, read and review web presentations: slides, linked buttons, pictures, runnable code.

Ownership verified
Status
Healthy
Uptime
99.8% over 22 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL

TDQS

A3.5/5.0

Scored across 45 tools

Disambiguation4/5

Most tools target distinct resource+action pairs and the descriptions are unusually detailed. However, several clusters overlap: add_slide/add_slides, get_slide/get_slides/get_presentation, and update_slide/edit_blocks/edit_slides all touch adjacent territory, so an agent could hesitate between them.

Naming Consistency4/5

Nearly all names follow a clean verb_noun pattern (create_presentation, delete_slide, list_comments, set_access). A few outliers like whoami, check_layout, and the verbose name_slides_after_titles break the pattern but remain readable and unambiguous.

Tool Count2/5

45 tools is well above the 25+ threshold for 'too many' and exceeds what the domain needs. The singular/plural pairs (add_slide/add_slides, get_slide/get_slides) and the update_slide/edit_blocks/edit_slides trio are natural consolidation candidates.

Completeness5/5

Coverage is exceptional: full CRUD across presentations, slides, blocks, comments, projects and access, plus versions/history, translations, import/export, code execution, layout checking and previews. No obvious lifecycle gaps or dead ends.

Available Tools

45 tools
add_commentLeave a noteAInspect

Leave a note on any presentation you can see -- on a slide ("slide_id") or on the whole presentation -- or answer a thread ("reply_to"). The owner of the presentation sees the note in the viewer; the thread is seen by the owner and by whoever started it.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
textYesThe note (plain text, up to 4000 characters).
reply_toNoThe id of a note to answer.
slide_idNoThe id of a slide (stable, the "id" of the slide in the presentation). Its number (position) changes when slides are reordered.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
textYes
agentNoName of the AI agent that wrote it, if any.
authorNo
resolvedNo
slide_idNonull: a note on the whole presentation.
created_atNoISO 8601 date and time.
slide_numberNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare this as a non-read-only, non-destructive, non-idempotent write. The description adds genuinely beyond that by disclosing the visibility model: the owner sees slide/presentation notes in the viewer, while a thread is visible to the owner and the thread starter. It does not cover retry/duplication behavior or rate limits.

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

Conciseness4/5

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

Two sentences, action-first, with the optional-parameter variants enumerated inline. The parenthetical quoted parameter names are a bit clunky and the second sentence is long, but nothing is redundant padding.

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, return values need not be explained, and 100% schema coverage handles parameter documentation. For a four-parameter write tool this is nearly complete; the remaining gap is the interaction between reply_to and slide_id and any permission failure behavior.

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 baseline is 3. The description re-frames slide_id versus reply_to in terms of target (slide note vs whole-presentation note vs thread answer), which adds some meaning, but it never resolves the important semantic ambiguity of whether reply_to and slide_id can or must be combined.

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 concrete verb+resource: leaving a note on a presentation/slide or replying to a thread, which is distinguishable from the sibling set (list_comments, delete_comment, resolve_comment). The only drag is terminology drift — it says "note" while the tool name and all siblings say "comment" — and it never explicitly names or excludes those siblings.

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

Usage Guidelines3/5

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

It does outline the three usage modes (slide-level, presentation-level, thread reply) and the access precondition ("any presentation you can see"), which is useful context. But it stops short of stating when to reply instead of starting a new note, whether the modes are mutually exclusive, or any alternative tool to use instead.

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

add_slideAdd a slideAInspect

Add a slide to a presentation you may edit, at the end or at "position" (1-based), optionally with its blocks right away. Returns the new slide (ids only unless "response" is "full").

ParametersJSON Schema
NameRequiredDescriptionDefault
hNoCanvas height in px (default 720).
wNoCanvas width in px (200-4000, default 1280).
bgNoBackground colour, #rrggbb.
fitNoHow the background picture fits.
nameNoSlide name (at most 100 characters), in the language of the presentation.
slugYesThe presentation's slug (its address: /movie/<slug>/).
name_trNoThe slide name in the other languages of the site: {"en": "..."}.
objectsNoBlocks of the slide, bottom to top: [{"type": "text"|"shape"|"button"|"line"|"image"|"code", "props": {...}}]. Missing props take the presentation theme's defaults (every prop is described in the block format reference). A link to a slide of the same presentation may be given as {"kind": "slide", "slide_number": N}.
positionNo1-based place; default: the end.
responseNo"brief" (default): only the ids, numbers and types of the slides and blocks; "full": every prop of every block too.
backgroundNoBackground picture: the "src" of an uploaded picture; null removes it.
transitionNoEntrance effect of this incoming slide (default: none).none
transition_durationNoAnimation duration in milliseconds (100-3000, default 500); not auto advance. Values outside the range are clamped.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hNo
wNo
bgNo
idYesStable id of the slide.
fitNo
urlNoThe address people open in a browser.
nameNo
numberYes1-based position; changes when slides are reordered.
name_trNoThe same text in the other languages of the site: {"en": "..."}.
objectsYesBlocks, bottom to top ("props" only in the full form).
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
backgroundNoThe "src" of the background picture, or null.
transitionNoEntrance effect of this incoming slide.
layout_warningsNoHow the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).
transition_durationNoAnimation milliseconds, not auto advance.
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=false, so the safety profile is carried. The description adds the edit-permission prerequisite and notes that block props fall back to theme defaults indirectly, but its return-value sentence largely restates the 'response' parameter rather than disclosing new behavior beyond 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?

Two tight sentences, front-loaded with the core action and placement behavior, with no filler. The inline quoted parameter names ('position', 'response') are the only mild density cost, so it stops short of a 5.

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 13-param mutation tool with nested block objects, the description covers the essentials an agent needs: placement semantics, optional inline block creation, permission requirement, and response verbosity. With a full schema and an output schema present, the remaining gaps (block-prop details, clamping rules) are acceptable.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema; the description only echoes 'position (1-based)' and the optional-blocks behavior without adding syntax or constraints the schema lacks. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose4/5

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

States a clear verb+resource ('Add a slide to a presentation') and adds scope qualifiers: edit permission, placement at end or at a 1-based position, and optional inline blocks. It is distinguishable from add_slides and edit_slides by implication ('a slide' vs bulk edit), but it never names the sibling that handles the batch case.

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

Usage Guidelines3/5

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

Usage is implied through the placement and inline-blocks options, and the 'presentation you may edit' phrasing hints at a permission prerequisite. It offers no explicit when-to-use or when-not-to-use guidance against add_slides (bulk add) or edit_slides (modify existing), which are the natural alternatives an agent must choose between.

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

add_slidesAdd several slidesAInspect

Add several slides at once to a presentation you may edit, at the end or from "position" (1-based) on. Each slide is {"name", "w", "h", "bg", "fit", "transition", "transition_duration", "background", "objects": [blocks]}. A link {"kind": "slide", "slide_number": N} counts the slides of the presentation as they are after the insertion, so new slides may lead to each other. Returns the new slides (ids only unless "response" is "full").

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
slidesYesThe slides: [{"name", "w", "h", "bg", "fit", "transition", "transition_duration", "background", "objects"}].
positionNo1-based place of the first new slide; default: the end.
responseNo"brief" (default): only the ids, numbers and types of the slides and blocks; "full": every prop of every block too.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNoSlides in the presentation now.
slidesYesThe new slides.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (non-readOnly, non-destructive, non-idempotent), so the bar is lower. The description still adds real behavioral context: the return shape (new slide ids, or full props when "response" is "full") and the non-obvious fact that slide links are resolved against post-insertion numbering. It does not state failure modes or what happens on partial insertion.

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 verb and scope, and every sentence carries information. The inline JSON-ish snippets mirror the schema and make it slightly harder to read than plain prose, but nothing is wasted.

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-parameter mutation tool with an output schema, the description covers insertion position, the response verbosity modes, and cross-slide link resolution. Return values largely live in the output schema, so it is close to complete; only error/edge-case behavior is unaddressed.

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 goes beyond the schema by explaining the self-referential link semantics ({"kind": "slide", "slide_number": N} counts slides as they are after insertion), which is the one parameter behavior the schema does not convey. It also restates the slide object's field list, which is redundant with 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?

States a specific verb+resource ("Add several slides at once to a presentation") and names the scope of the operation (at end or from "position"). It implicitly differentiates from the sibling add_slide via "several slides at once", but never names the single-slide alternative, so an agent must infer the routing.

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

Usage Guidelines3/5

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

Usage is implied by the batch framing rather than stated: an agent can infer this is for multiple slides, but there is no explicit when-to-use/when-not or named alternative versus add_slide/edit_slides. The phrase "a presentation you may edit" does at least signal a permission prerequisite.

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

answer_access_requestAnswer an access requestAInspect

Approve or decline a request for access to one of your presentations or projects. "role" may change what is given (default: what was asked for); "whole_project" gives it for every presentation of the project of that presentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNo"view" -- read; "edit" -- read and change.
approveYestrue approves the request, false declines it.
request_idYesThe id of the access request.
whole_projectNoGive the access for the whole project the presentation is in (default false: this presentation only).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
roleNoview or edit.
userNoWho asks.
agentNo
titleNo
statusYespending, approved or declined.
messageNo
projectNoSlug of the project, for access to all of it.
created_atNoISO 8601 date and time.
presentationNoSlug of the presentation (null: a project).

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the safety profile is covered. The description adds useful effect semantics (role alters what is granted; whole_project extends the grant), but says nothing about permissions required, notifications, or reversibility.

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 front-loaded sentences: the core action first, then parameter clarifications. Efficient, though the parenthetical definitions are slightly redundant with schema text.

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, return values need no explanation, and all parameters are covered by the schema. The only gap is that the description does not point to list_access_requests for obtaining a request_id, which an agent must supply.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented, including the role enum and the whole_project default. The description restates role and whole_project semantics rather than adding format or edge-case detail, 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?

The description states a specific action (approve or decline) on a specific resource (a request for access to your presentations or projects). An agent can distinguish this from siblings like set_access, request_access, and list_access_requests without opening any schema.

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

Usage Guidelines3/5

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

Usage is implied by the name and the mutation semantics, but the description never says when to use this versus alternatives such as set_access (direct access changes) or list_access_requests (finding a request_id). No prerequisites or workflow context are given.

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

check_layoutCheck how slides will lookA
Read-onlyIdempotent
Inspect

Warnings about how the slides of a presentation look: a text that runs past its block or code that is cut off ("overflow"), a block partly or wholly outside the slide ("cut", "outside"), text blocks lying over each other ("overlap"). Texts and code are measured in a browser on the server ("measured": true); when that is not available their sizes are estimated from the letter widths of the font. Only what shows counts: a text on a block without fill or border may run into the bottom padding. The changing operations add the (estimated) warnings of the slides they changed to their answer ("layout_warnings").

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
slide_idsNoOnly these slides (ids).
to_numberNoOnly the slides up to this number (inclusive).
from_numberNoOnly the slides from this number on (1-based).

Output Schema

ParametersJSON Schema
NameRequiredDescription
checkedYesSlides checked.
measuredNoThe texts were measured in a browser (false: estimated).
warningsYesHow the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so safety is covered. The description goes well beyond that: it explains the server-side browser measurement versus font-width estimation ('measured': true), the visible-content-only rule where text on a block without fill/border can spill into padding, and the cross-tool behavior that mutating operations return layout_warnings. That is meaningful behavioral context; only the exact response shape is left unstated.

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 body is a single dense paragraph with stacked parentheticals and long clauses ('The changing operations add the (estimated) warnings of the slides they changed to their answer'), which makes it harder to scan. Every element is informative, but the structure could be tightened into discrete points.

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 described, and the description fills in the diagnostic semantics (warning categories, measurement method, visibility caveat) an agent needs to interpret results. The main remaining gap is guidance on when to invoke it versus preview/get siblings, which is a usage rather than completeness issue.

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 slug, slide_ids, from_number and to_number are already documented in the schema. The description adds nothing about the selector parameters, which is acceptable given full coverage, so the baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb-ish purpose (reporting warnings about how slides look) and enumerates the exact conditions it detects: overflow, cut/outside, overlap, with the quoted keywords an agent would see in output. It clearly separates this analysis tool from mutation siblings. It stops short of naming a sibling such as preview_slides or get_slides to route the agent, so it is clear but not fully differentiated.

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?

Implicit usage is conveyed: check layout to learn about text/code that overflows, is clipped, or overlaps. It also hints that changing operations already append layout_warnings, which tells the agent it may not need a separate call. However, there is no explicit when-to-use / when-not-to-use statement or named alternative, leaving the routing to inference.

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

create_presentationCreate a presentationAInspect

Create a new presentation of yours, empty or complete in one call. "slides" is a list of {"name", "name_tr", "w", "h", "bg", "fit", "background", "objects": [blocks]}; blocks may link to each other's slides with {"kind": "slide", "slide_number": N} (1-based, in this list). Returns the new presentation with the ids of its slides and blocks (every prop too with "response": "full"). Every presentation is in all the languages of the site (ru, en) at once: write the texts in "lang" and give the other languages right away -- "title_tr", "name_tr" of every slide and "tr" in the props of every text, shape and button block ({"en": ""}); the layout is shared. The answer lists what is still "missing_translations".

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoThe language "title", slide names and blocks' "html" are written in (default: the one most of the words of the title, the slide names and the texts are in).
themeNoDefault colours of the slides and of new blocks.
titleYesTitle (at most 100 characters).
accessNoWho sees it (default "private": only you, until you publish it; "public": everybody reads it; "open": every signed-in person edits it too).
slidesNoSlides with their blocks (optional).
projectNoSlug of one of your projects to create the presentation in (at its end); its blocks may then lead to the slides of the other presentations of that project.
databaseNoSetup scripts of the databases the runnable code blocks work in, by language. Every viewer runs the blocks in a private database made from the script (up to 50000 characters each; an empty string removes a script).
responseNo"brief" (default): only the ids, numbers and types of the slides and blocks; "full": every prop of every block too.
title_trNoThe title in the other languages of the site: {"en": "..."}.
descriptionNoDescription shown on the presentation page (optional).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlNoThe address people open in a browser.
langNoThe language its texts are written in; "tr" holds the others.
slugYesThe address of the presentation: /movie/<slug>/.
ownerNoUser name of the author.
themeNo
titleYes
accessNoopen, public or private.
slidesYes
projectNoThe project it belongs to, or null.
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
can_editNoWhether you may change it.
databaseNoSetup scripts of the databases of runnable code blocks (shown to the author only).
title_trNoThe same text in the other languages of the site: {"en": "..."}.
languagesNoThe languages of the site.
cover_slideNoId of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).
descriptionNo
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare a non-destructive, non-idempotent, closed-world write. The description goes well beyond that by disclosing return behavior (new presentation with slide/block ids, full props with 'response': 'full'), the eager multi-language sync model, and that the answer reports 'missing_translations'. It lacks permission/auth context, hence not 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?

Front-loaded with the core purpose, then structured detail on the slides list, multilingual requirement, and return format. Information-dense with little waste, though several sentences are run-ons that slow parsing.

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

Completeness4/5

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

For a 10-parameter tool with nested objects and an output schema, the description covers the essential mental model: structure of slides/blocks, the multilingual obligation, and what the response contains. It is complete enough to call correctly, though explicit 'when to prefer over add_slide' routing is absent.

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 per-parameter baseline is 3, but the description adds cross-parameter semantics the schema does not: how slide objects link via {"kind": "slide", "slide_number": N}, and how lang, title_tr, name_tr, and per-block 'tr' must all be supplied together. This relational guidance is genuinely value-adding.

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 ('Create a new presentation') and clarifies the scope with 'empty or complete in one call', which distinguishes it from the incremental siblings add_slide/add_slides and from update_presentation. An agent can identify the creation path 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 Guidelines3/5

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

The phrase 'empty or complete in one call' implies this tool subsumes slide creation, but it never explicitly states when to use it versus add_slide, add_slides, or import_presentation. Usage is implied rather than spelled out, and no exclusions or prerequisites are given.

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

create_projectCreate a projectAInspect

Create a project of yours, optionally putting some of your presentations into it (in this order). A presentation is in one project at most: one that is in another project moves over.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTitle (at most 100 characters).
descriptionNoDescription (optional).
presentationsNoSlugs of presentations.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlNoThe address people open in a browser.
roleNoowner, edit, view or null.
slugYesThe address of the project: /project/<slug>/.
ownerNo
titleYes
accessNoopen, public or private: inherited by its presentations.
grantsNoWho was given access (the owner sees it).
is_ownerNo
descriptionNo
presentationsNoIts presentations, in order.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations declare a non-readonly, non-destructive, non-idempotent write, but they cannot express the side effect the description supplies: a presentation already in another project is moved out of it. That cross-resource mutation is exactly the kind of context annotations miss, though permissions/limits are not mentioned.

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

Conciseness5/5

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

Two sentences, zero filler, and the primary action is front-loaded before the optional-parameter and side-effect details. Every clause carries information the caller needs.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description covers the notable side effect; only ownership/permission requirements for creating in a workspace are left unstated.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: the presentations array is consumed 'in this order', and the one-project-per-presentation constraint governs which slugs are valid inputs.

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

Purpose4/5

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

States a specific verb+resource ('Create a project') plus scope ('of yours') and the optional inclusion of presentations. It distinguishes itself from update_project/get_project only implicitly via the create framing and the move-over behavior; no sibling is named outright.

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 create framing implies when to use it versus update_project, but there is no explicit when-to-use, when-not-to-use, or alternative routing. The move-over sentence is behavioral, not usage guidance, so the agent must infer the boundary.

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

delete_commentDelete a noteA
DestructiveIdempotent
Inspect

Delete a note (with its replies, when it starts a thread). Its author or the owner of the presentation may do it.

ParametersJSON Schema
NameRequiredDescriptionDefault
comment_idYesThe id of a note.

Output Schema

ParametersJSON Schema
NameRequiredDescription
deletedYesId of the deleted note.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds two pieces of context the annotations cannot: the cascading deletion of replies when the note starts a thread, and the authorization requirement (author or presentation owner).

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

Conciseness5/5

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

Two short sentences, no filler, with the core action and its cascade effect front-loaded before the permission clause. 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?

With annotations covering the mutation/destructive profile, an output schema present, and the parameter fully documented, the description supplies the remaining critical facts: cascade deletion and who is authorized. Only the distinction from resolve_comment is left implicit.

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 comment_id parameter, so the schema fully documents the input. The description adds no format, syntax, or lookup guidance beyond what the schema provides, making the baseline 3 appropriate.

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

Purpose4/5

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

States a specific verb and resource ('Delete a note') and clarifies the cascade scope ('with its replies, when it starts a thread'). It is clearly distinguishable from add_comment/list_comments, though it does not explicitly contrast with resolve_comment, which is the nearest ambiguous sibling.

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 a permission condition ('Its author or the owner of the presentation may do it') but gives no explicit when-to-use guidance versus alternatives such as resolve_comment (which likely closes rather than removes a comment). Usage is only implied.

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

delete_presentationDelete a presentationB
DestructiveIdempotent
Inspect

Delete one of your presentations (it disappears from the site and from the list of presentations).

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).

Output Schema

ParametersJSON Schema
NameRequiredDescription
deletedYesSlug of the deleted presentation.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds the specific effect that the presentation disappears from the site and from the list, which is modest context beyond the annotations but no irreversibility or permission detail.

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

Conciseness4/5

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

A single efficient sentence with the core action front-loaded and the parenthetical clarifying scope. No wasted verbiage, though the parenthetical is nearly redundant with the destructive annotation.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and annotations cover the destructive/idempotent nature. However, for a permanent deletion tool there is no word on reversibility or preconditions, leaving a small but real gap.

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 a single well-documented slug parameter, so the schema carries the semantic load. The description adds nothing about the identifier beyond what the schema already provides, matching the baseline for full coverage.

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

Purpose4/5

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

States a specific verb (delete) and resource (presentation), making it immediately distinguishable from delete_slide and delete_project by name. It stops short of explicitly contrasting itself with siblings, but the action and target are unambiguous.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus alternatives (e.g., restoring via restore_version, or deleting slides individually), nor any stated prerequisite such as required permissions or confirmation. The agent must infer usage entirely.

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

delete_projectDelete a projectA
DestructiveIdempotent
Inspect

Delete a project of yours. Its presentations stay, as presentations on their own; the links between them stop leading anywhere.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYesThe project's slug (its address: /project/<slug>/).

Output Schema

ParametersJSON Schema
NameRequiredDescription
deletedYesSlug of the deleted project.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false. The description adds genuinely new behavioral context: presentations are preserved, and their internal links dangle afterwards. That surviving-side-effect detail is exactly what annotations cannot express.

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

Conciseness5/5

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

Two short sentences, front-loaded with the action and followed by the exact consequence. No filler, no restatement of the title.

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 and annotations carry the safety profile, so the description's job is narrow: clarify collateral effects. It does that well. What is missing is any mention of required permissions or whether the deletion is recoverable.

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

Parameters3/5

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

Schema coverage is 100% and the single 'project' param is documented as a slug with its address format. The description's 'of yours' hints at an ownership precondition but adds no syntax or identification detail beyond the schema. 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?

Clear specific verb+resource ('Delete a project'), scoped by ownership ('of yours'). The consequence sentence implicitly distinguishes it from delete_presentation (presentations survive), though no sibling is named explicitly.

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

Usage Guidelines2/5

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

No statement of when to choose this over delete_presentation or update_project, and no prerequisites or warnings. Ownership ('of yours') is the only implied constraint; the rest 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.

delete_slideDelete a slideB
DestructiveIdempotent
Inspect

Delete a slide of your presentation. Links that led to it stop leading anywhere.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
slide_idYesThe id of a slide (stable, the "id" of the slide in the presentation). Its number (position) changes when slides are reordered.
base_versionNoOptional: the "version" of the slide as you read it. The change is refused (409 conflict) when somebody changed the slide meanwhile, instead of overwriting their work.

Output Schema

ParametersJSON Schema
NameRequiredDescription
slidesNoSlides left.
deletedYesId of the deleted slide.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered structurally. The description adds one genuinely useful side-effect disclosure — 'Links that led to it stop leading anywhere' — which is not derivable from annotations, but it says nothing about reversibility (restore_version exists) or the conflict behavior beyond what the schema already documents.

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

Conciseness5/5

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

Two short sentences, zero filler, with the action stated first and the consequence 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?

An output schema exists, annotations cover the safety profile, and all three parameters are documented in the schema, so the description need not restate returns or field meanings. What is missing is guidance on when deletion is appropriate versus editing or restoring, and any note on whether the deletion is recoverable.

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 slug, slide_id, and the optional base_version all fully explained in the schema itself, including the 409 conflict semantics. The description adds no parameter-level detail, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (Delete) and resource (a slide of your presentation), which cleanly separates it from delete_presentation, delete_comment, and delete_project by resource type. It never explicitly contrasts with the neighboring slide-mutating tools (add_slide, update_slide, edit_slides), so it stops short of full sibling differentiation.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance, no prerequisites, and no mention of alternatives such as update_slide or restore_version. The agent must infer usage entirely from the tool name and the sibling list.

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

edit_blocksAdd, change or delete blocksAInspect

Change some blocks of a slide and leave the others alone, in one step: "add": new blocks [{"type", "props"}] (placed on top, or at the bottom with "at_bottom": true); "update": [{"id", "props"}] -- only the given props change. The same props for several blocks at once, like selecting them in the editor: {"ids": [...], "props"}; or for a card and everything drawn on it: {"inside": <id of the card's background block>, "props"} -- that block and every block lying within its rectangle (props a block type does not have, like "link" of a code block, are skipped for it); "delete": [block ids]. Returns the slide (ids only unless "response" is "full").

ParametersJSON Schema
NameRequiredDescriptionDefault
addNoNew blocks: [{"type", "props"}].
slugYesThe presentation's slug (its address: /movie/<slug>/).
deleteNoIds of blocks to delete.
updateNoChanges: [{"id" | "ids": [...] | "inside": <card block id>, "props"}].
responseNo"brief" (default): only the ids, numbers and types of the slides and blocks; "full": every prop of every block too.
slide_idYesThe id of a slide (stable, the "id" of the slide in the presentation). Its number (position) changes when slides are reordered.
at_bottomNoPut the added blocks under the others (default: on top).
base_versionNoOptional: the "version" of the slide as you read it. The change is refused (409 conflict) when somebody changed the slide meanwhile, instead of overwriting their work.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hNo
wNo
bgNo
idYesStable id of the slide.
fitNo
urlNoThe address people open in a browser.
nameNo
numberYes1-based position; changes when slides are reordered.
name_trNoThe same text in the other languages of the site: {"en": "..."}.
objectsYesBlocks, bottom to top ("props" only in the full form).
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
backgroundNoThe "src" of the background picture, or null.
transitionNoEntrance effect of this incoming slide.
layout_warningsNoHow the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).
transition_durationNoAnimation milliseconds, not auto advance.
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false), the description discloses meaningful behavior: update only alters the given props, props a block type lacks are skipped, added blocks land on top unless at_bottom is set, and response defaults to brief. It stops short of covering permissions/auth or the semantics of the destructive 'delete' path.

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-loads the core idea in the first clause, then breaks add/update/delete into compact labeled segments. Dense and example-driven but every sentence carries operational detail; nothing is filler.

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 an 8-parameter tool with multi-shape params, the description covers the operation semantics and default behaviors well, and the output schema (present) handles return values. The main residual gap is the absence of routing guidance versus sibling edit/slide-mutation tools.

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% (baseline 3), and the description adds real meaning on top: it details the three update shapes (single id, ids list, and the 'inside' card form) and explains that 'inside' covers the card background block plus every block within its rectangle. That 'inside' semantics is not conveyed by the schema description 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?

The description states a specific verb+resource scope: 'Change some blocks of a slide and leave the others alone, in one step', and enumerates the three operations (add/update/delete) it supports. The 'blocks' focus clearly distinguishes it from siblings like edit_slides, update_slide, and replace_text without needing to open any schema.

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

Usage Guidelines3/5

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

It implies when to use it ('leave the others alone, in one step' = a surgical partial edit) but never names an alternative tool or states a when-not condition. With siblings edit_slides, update_slide, and replace_text all in play, the agent must infer which to pick.

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

edit_slidesChange blocks on several slidesAInspect

Change blocks on many slides in one step (and one version in the history). "edits" is a list of {"slide_id", "add", "update", "delete", "at_bottom", "base_version"}; on its slide each item adds new blocks ("add": [{"type", "props"}], on top or with "at_bottom": true under the others), changes the given props of blocks ("update": [{"id" | "ids": [...] | "inside": , "props"}]) and deletes blocks ("delete": [ids]). Nothing is changed when one item is wrong (or its slide changed meanwhile). Returns the changed slides.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
editsYesUp to 100 items: [{"slide_id", "add"?, "update"?, "delete"?, "at_bottom"?, "base_version"?}].
responseNo"brief" (default): only the ids, numbers and types of the slides and blocks; "full": every prop of every block too.

Output Schema

ParametersJSON Schema
NameRequiredDescription
slidesYesThe changed slides.
layout_warningsNoHow the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing atomicity ('Nothing is changed when one item is wrong'), optimistic-concurrency behavior ('or its slide changed meanwhile'), and the version-history effect. These are non-obvious traits not derivable from readOnlyHint/destructiveHint, and they do not conflict with destructiveHint=false since deletes are recoverable through the created version.

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 one-step value proposition and otherwise dense with essential semantics; there is some packing of three operations into a single sentence, but no filler sentences.

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 high-complexity batch mutation tool whose gotchas (atomicity, concurrency check, history version, response verbosity) are all covered; return values are further backed by an output schema, so nothing critical 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?

The schema types `edits.items` only as a generic object, and the description compensates fully by spelling out the item keys (slide_id, add, update, delete, at_bottom, base_version) and the semantics of add placement, update targeting (id/ids/inside), and delete. Without it, the array would be opaque.

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+scope: 'Change blocks on many slides in one step (and one version in the history)'. The batch scope implicitly distinguishes it from edit_blocks/update_slide, but no sibling is named explicitly, so an agent must infer that edit_blocks is the single-slide variant.

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 'in one step' phrasing implies this is the batch alternative to single-slide editing and surfaces the versioning advantage, but there is no explicit when-to-use/when-not statement or named alternative among the many sibling write tools (edit_blocks, update_slide, add_slide, reorder_slides).

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

export_presentationExport as PowerPoint, archive or PDFA
Read-onlyIdempotent
Inspect

A file of one of your presentations: "pptx" (PowerPoint: texts, shapes, pictures and links stay editable), "zip" (the site's own archive: everything, also the database scripts; it can be imported back) or "pdf" (one page per slide, as viewers see it). Returns a download "url" that works without a key for an hour. Only the author may export.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
formatYesThe kind of file.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesWhere to download the file.
noteNo
formatYes
filenameNo
expires_inNoSeconds the url works.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavior: the returned download URL works without a key for one hour (temporal/auth detail), export is restricted to the author (authorization), and each format's fidelity is described. This is meaningful added context beyond 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?

Dense single paragraph with zero filler; the format enumeration carries most of the information load and the permission constraint is placed last. The leading fragment 'A file of one of your presentations:' is slightly awkward as an opener but quickly resolves into specifics.

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?

Covers the essentials for a low-complexity, 2-param tool: output artifact types, the download URL, its expiry, and the caller restriction. With an output schema present there is no obligation to describe return structure, so the remaining gap (error modes) is minor.

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's terse 'The kind of file' by explaining what each enum value actually contains and whether it is editable or re-importable. That materially disambiguates the format choice.

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+resource ('export' a 'presentation') and immediately distinguishes itself from siblings like import_presentation and get_format by enumerating the three output artifacts it produces. An agent can tell exactly what this tool produces 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 Guidelines4/5

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

Gives clear selection guidance for the format enum (pptx = editable, zip = site archive re-importable, pdf = viewer-faithful), which is effectively when-to-use guidance for the enum. It also states the authorization prerequisite ('Only the author may export'). It does not explicitly name an alternative sibling for related reads, so it falls just short of 5.

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

get_accessAccess settingsC
Read-onlyIdempotent
Inspect

The access settings of your presentation: its own level ("open", "public", "private"), the level that counts ("effective_level": a presentation of a project inherits the project's level when that one is stricter), who was given access (and which role), and the pending requests.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).

Output Schema

ParametersJSON Schema
NameRequiredDescription
levelYesopen, public or private: the presentation's own level.
grantsNo
project_levelNoThe level of its project, if any.
effective_levelNoThe level that counts (the project's one when stricter).
pending_requestsNo

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds genuinely non-obvious domain behavior: effective_level inheritance where a presentation in a project inherits the project's level when that one is stricter. That inheritance rule is real value beyond annotations. However it doesn't clarify whether output is a snapshot, or that pending requests are included read-only (vs. the actionable list elsewhere).

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

Conciseness2/5

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

The description is a single sentence that is really a field inventory, and it is not front-loaded with the action. It spends its length enumerating return-value fields (which an output schema already covers) rather than stating what the tool does or when to use it.

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

Completeness3/5

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

An output schema exists, so return values needn't be explained in prose; the field enumeration is largely redundant with that schema. The inheritance rule is a useful addition, but the definition still lacks a plain purpose statement and any routing versus siblings, leaving the agent to infer when to call it.

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

Parameters3/5

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

Schema coverage is 100% and the single 'slug' parameter is fully documented in the schema as the presentation's address. The description adds no parameter meaning beyond what the schema provides, which is the baseline-3 case.

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

Purpose3/5

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

The description enumerates the fields of the access settings object (own level, effective level, who has access, pending requests) but never states the action plainly: that it retrieves/returns the access settings for a presentation. There is no leading verb like 'Get' or 'Return'. The agent can infer it's a read from the name and annotations, but the sentence itself is a content list rather than a purpose statement.

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

Usage Guidelines2/5

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

No guidance on when to use this vs. siblings like list_access_requests, whoami, request_access, or set_access. An agent cannot tell from the description whether pending requests returned here overlap with list_access_requests, or that set_access is the mutation counterpart. Usage must be inferred entirely.

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

get_formatBlock format referenceB
Read-onlyIdempotent
Inspect

The complete reference of what a slide can contain: block types with every prop and its default, allowed values of every enumerated prop, number ranges, colour props, link kinds, fonts, shapes and themes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
htmlNo
enumsNo
linksNo
typesYes
canvasNo
colorsNo
bordersNo
numbersNo
booleansNo
languagesNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is fully covered and the description does not contradict it. The description adds that this is a 'complete reference' (i.e. static documentation data), but offers no additional behavioral context beyond that; with annotations carrying the load, a 3 is appropriate.

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

Conciseness4/5

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

A single front-loaded sentence with a colon-separated inventory of what the reference contains; nothing is padded. The enumeration is long but each item earns its place by signalling the reference's breadth.

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 zero-parameter static reference with an output schema already describing the returned structure, the description is largely complete — the agent needs no return-value detail. The only gap is the absent routing guidance relative to the many block/slide-editing siblings.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. There are no argument semantics to clarify, and the description correctly does not waste space inventing any.

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

Purpose4/5

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

The description names a specific resource and enumerates its contents precisely ('block types with every prop and its default, allowed values of every enumerated prop, number ranges, colour props...'), so an agent knows this returns a schema-style reference document rather than slide data. It does not, however, explicitly contrast itself with adjacent tools such as check_layout or get_slide, so the distinction is inferable rather than stated.

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

Usage Guidelines2/5

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

There is no when-to-use guidance: nothing says to consult this before add_slide/edit_blocks, nor how it relates to check_layout. The agent must infer that this is a lookup resource for block structure. No alternatives or exclusions are offered.

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

get_presentationGet a presentation for editingA
Read-onlyIdempotent
Inspect

A presentation you can see, with every slide and every block (ids and complete props), in playback order. Use the ids to edit slides and blocks ("can_edit" says whether you may). Links to slides show both "slide" (id) and "slide_number". All of a presentation of 30 slides is a few hundred thousand characters: read a big one in parts -- "from_number" / "to_number" or "slide_ids", and "texts_only": true gives only the words of the blocks (html, tr, code), no geometry. Every slide has a "version": pass it as "base_version" when you change the slide.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
slide_idsNoOnly these slides (ids).
to_numberNoOnly the slides up to this number (inclusive).
texts_onlyNoOnly the texts of the blocks (for reading, checking or translating), not their props.
from_numberNoOnly the slides from this number on (1-based).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlNoThe address people open in a browser.
langNoThe language its texts are written in; "tr" holds the others.
slugYesThe address of the presentation: /movie/<slug>/.
ownerNoUser name of the author.
themeNo
titleYes
accessNoopen, public or private.
slidesYes
projectNoThe project it belongs to, or null.
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
can_editNoWhether you may change it.
databaseNoSetup scripts of the databases of runnable code blocks (shown to the author only).
title_trNoThe same text in the other languages of the site: {"en": "..."}.
languagesNoThe languages of the site.
cover_slideNoId of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).
descriptionNo
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already carry the read-only/idempotent safety profile, and the description adds genuinely useful behavior: the size warning (a 30-slide deck is a few hundred thousand characters), how to page with from_number/to_number or slide_ids, what texts_only returns, and that each slide's 'version' must be passed as base_version on edits. It stops short of describing return envelope or link-resolution structure in depth.

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?

It is front-loaded around the core return shape and then the paging advice, with zero filler sentences. The heavy parentheticals and quotation marks make it dense, but each sentence carries information an agent needs.

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

Completeness4/5

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

With an output schema present, the description needn't enumerate return values, and it still covers the practical concerns an agent faces: paging, size, texts_only, can_edit, and version/base_version coupling. It leaves the sibling-routing question open, which is the main missing piece.

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 description goes beyond the schema by explaining the intent behind texts_only ('only the words of the blocks (html, tr, code), no geometry') and the from/to_number paging pattern. It slightly blurs base_version (an output field consumed by edit tools) into this tool's surface, but the extra semantics are real.

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+resource and scope: it returns every slide and every block (ids and complete props) in playback order, and frames it as 'for editing'. It implies a distinction from single-slide readers like get_slide, but never names a sibling, so the differentiation is left to inference.

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

Usage Guidelines3/5

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

It tells the agent to use the returned ids to edit slides and blocks and advises reading large presentations in parts, which implies the workflow. However it never states when to prefer this over get_slide, get_slides, or read_presentation, so the routing among closely-named siblings is unaddressed.

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

get_projectGet a projectC
Read-onlyIdempotent
Inspect

A project you can see, with its presentations (the ones you can see) in order.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYesThe project's slug (its address: /project/<slug>/).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlNoThe address people open in a browser.
roleNoowner, edit, view or null.
slugYesThe address of the project: /project/<slug>/.
ownerNo
titleNo
accessNoopen, public or private: inherited by its presentations.
grantsNoWho was given access (the owner sees it).
is_ownerNo
descriptionNo
presentationsYes

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered structurally. The description adds that only visible projects and presentations are returned and that presentations come in order, which is genuine extra context, but it says nothing about error/not-found behavior for a slug the caller cannot see.

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?

It is short, but the parenthetical '(the ones you can see)' interrupts an already fragmentary sentence and there is no front-loaded statement of what the tool does. Brevity here reads as under-specification rather than efficient structure.

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

Completeness3/5

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

With an output schema present, return values need not be explained, yet the description spends its only sentence on return composition. Annotations cover safety. For a low-complexity single-parameter read the description is minimally sufficient, but it never states the fundamental purpose or when to reach for it.

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 single 'project' parameter has 100% schema description coverage, including the slug format '/project/<slug>/'. The description adds no parameter-level meaning, so the schema-only baseline of 3 applies.

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

Purpose3/5

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

The description is a noun phrase with no verb, so the action (fetch/retrieve one project) is only implied by the name 'get_project'. It does add return-content information ('with its presentations ... in order'), which goes slightly beyond a tautology, but it never distinguishes this tool from get_presentation or 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 Guidelines2/5

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

There is no statement of when to use this tool versus get_presentation, list_projects, or get_slide. The phrase 'the ones you can see' hints at a permission scope but is not framed as usage guidance, so an agent gets no routing help.

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

get_slideGet one slideB
Read-onlyIdempotent
Inspect

One slide of a presentation you can see, with all of its blocks (ids and complete props).

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
slide_idYesThe id of a slide (stable, the "id" of the slide in the presentation). Its number (position) changes when slides are reordered.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hNo
wNo
bgNo
idYesStable id of the slide.
fitNo
urlNoThe address people open in a browser.
nameNo
numberYes1-based position; changes when slides are reordered.
name_trNoThe same text in the other languages of the site: {"en": "..."}.
objectsYesBlocks, bottom to top ("props" only in the full form).
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
backgroundNoThe "src" of the background picture, or null.
transitionNoEntrance effect of this incoming slide.
layout_warningsNoHow the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).
transition_durationNoAnimation milliseconds, not auto advance.
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, and non-openWorld, so the safety profile is fully covered. The description adds modest value by explaining that the returned slide includes all blocks with ids and complete props, but says nothing about visibility/permission constraints or pagination that a 'can see' qualifier hints at.

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

Conciseness4/5

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

A single front-loaded sentence that efficiently conveys scope and return content with no filler. It is arguably terse, but every clause earns its place.

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

Completeness3/5

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

With an output schema covering return values and annotations covering safety, the description needn't explain those. For a simple two-param read tool it is close to complete, but given the crowded sibling set it should have clarified when to prefer this over get_presentation/read_presentation.

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%; both slug and slide_id are well documented (including the stable-id-vs-position caveat). The description adds nothing beyond the schema, so the baseline 3 is appropriate.

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

Purpose4/5

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

Names a specific verb and resource (get one slide) plus what it returns ('all of its blocks (ids and complete props)'), so the agent knows exactly what it fetches. However, it does not distinguish itself from close siblings like get_presentation, read_presentation, or preview_slides, leaving the 'one slide vs whole deck' boundary 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?

No when-to-use guidance, no prerequisites, and no mention of alternatives. The presence of get_presentation, read_presentation, update_slide, and preview_slides among siblings makes routing ambiguous, and the description offers nothing to resolve it.

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

get_slidesGet some slides for editingA
Read-onlyIdempotent
Inspect

Some slides of a presentation you can see, with their blocks (ids and complete props) -- a part of a big presentation: "from_number" / "to_number" (1-based, inclusive) and/or "slide_ids"; "texts_only": true gives only the words of the blocks (html, tr, code), no geometry. Every slide has a "version": pass it as "base_version" when you change the slide. The answer also has the presentation's "version" and "slides_total".

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
slide_idsNoOnly these slides (ids).
to_numberNoOnly the slides up to this number (inclusive).
texts_onlyNoOnly the texts of the blocks (for reading, checking or translating), not their props.
from_numberNoOnly the slides from this number on (1-based).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlNoThe address people open in a browser.
langNoThe language its texts are written in; "tr" holds the others.
slugYesThe address of the presentation: /movie/<slug>/.
ownerNoUser name of the author.
themeNo
titleNo
accessNoopen, public or private.
slidesYes
projectNoThe project it belongs to, or null.
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
can_editNoWhether you may change it.
databaseNoSetup scripts of the databases of runnable code blocks (shown to the author only).
title_trNoThe same text in the other languages of the site: {"en": "..."}.
languagesNoThe languages of the site.
cover_slideNoId of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).
descriptionNo
slides_totalNo
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: the per-slide 'version' should be passed back as 'base_version' when changing a slide, and the response carries the presentation 'version' and 'slides_total' — meaningful for optimistic-concurrency editing.

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 what is returned, then parameter and version semantics. It is dense and reads as one long dash-separated sentence, but nearly every clause carries information an agent needs; little is wasted.

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 document return values, yet it usefully flags version and slides_total. All five parameters are covered and the editing/version workflow is explained, leaving only alternative-tool routing unaddressed.

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 adds meaning the schema does not: from_number/to_number are 1-based and inclusive, and texts_only yields html/tr/code block text with 'no geometry', clarifying what is dropped. That is genuine added value over the schema text.

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

Purpose4/5

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

States a specific verb+resource (get slides) plus scope: a subset of a larger presentation with blocks containing ids and complete props. The partial-retrieval framing implicitly contrasts with whole-presentation reads, but no sibling (get_slide, read_presentation, preview_slides) is named, so differentiation is left to inference.

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

Usage Guidelines3/5

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

It does give a use-case cue for texts_only ('for reading, checking or translating') and explains the numbering/ids selection, which is useful. However there is no explicit when-to-use-vs-alternatives guidance — nothing tells the agent when to pick this over get_slide or read_presentation.

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

get_versionContent of a versionB
Read-onlyIdempotent
Inspect

What a presentation you may edit looked like in a version: "markdown" (default) -- its slides and texts as markdown; "json" -- the complete content.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
formatNoResult format: "markdown" (default) or "json" (the complete content).
numberYesThe version number.

Output Schema

ParametersJSON Schema
NameRequiredDescription
agentNo
authorNo
numberYes
changesNoWhat changed in this version.
contentNo
markdownNo
created_atNoISO 8601 date and time.
updated_atNoISO 8601 date and time.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description adds some value by characterizing what is returned (slides and texts as markdown, or complete content as json), but says nothing about permissions actually required, size limits, or behavior on a non-existent version number.

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

Conciseness4/5

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

A single compact sentence with the format options enumerated inline; nothing is wasted. The opening clause 'What a presentation you may edit looked like in a version' is slightly convoluted, which keeps it from a 5.

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

Completeness3/5

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

With an output schema present, return values needn't be explained, and the schema covers all three parameters. However, the description omits how an agent obtains a valid version number and how this read relates to restore_version, which is a noticeable gap for a tool living among many version/history 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 description coverage is 100%, so the schema already documents slug, number, and format, and the enum with its default. The description repeats the format semantics ('markdown' default, 'json' complete content) rather than adding syntax or constraints beyond the schema. Baseline 3 applies when the schema carries the load.

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

Purpose4/5

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

The description names a specific verb+resource combo — retrieving the content of a version of a presentation — and the format clause clarifies what 'content' means. It is clear on its own but does not distinguish itself from siblings like list_history, restore_version, or read_presentation, so the agent must still infer where it fits.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance. The phrase 'a presentation you may edit' hints at a permission precondition but says nothing about when this tool should be chosen over list_history (finding the version number) or restore_version (reverting). No alternatives or exclusions are named.

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

import_presentationImport a PowerPoint or EaseWeb fileAInspect

Create a new presentation of yours from a PowerPoint file (.pptx) or an EaseWeb archive (.zip, as exported by the site): slides, texts with their formatting, shapes, pictures, backgrounds and links become editable blocks, the way the "Import" button of the site does it. Returns the new presentation (ids only unless "response" is "full") and "warnings" about what could not be converted. With "into" (the slug of a presentation you may edit) the file updates that presentation instead: slide N of the file replaces the blocks and the background of slide N, which keeps its id, so links to it, notes and history stay; unchanged texts keep their translations. "slides" limits it to some numbers of the file; slides of the file after the last one of the presentation are added. Its title, theme, slide names and database scripts stay.

ParametersJSON Schema
NameRequiredDescriptionDefault
intoNoSlug of an existing presentation to update from the file (instead of creating a new one).
titleNoTitle of the new presentation (optional).
accessNoWho sees it (default "private": only you, until you publish it; "public": everybody reads it; "open": every signed-in person edits it too).
renameNoWith "into": give the slides the names the file has (default false: they keep theirs).
slidesNoWith "into": only these slide numbers of the file (1-based); all by default.
projectNoSlug of one of your projects to put the presentation in.
filenameNoName of the file, like "lecture.pptx" (its extension helps to recognise the format; without a title, it gives the title).
responseNo"brief" (default): only the ids, numbers and types of the slides and blocks; "full": every prop of every block too.
data_base64YesThe file, base64 (a data: URL prefix is allowed; at most 28 MB).
base_versionNoWith "into": the "version" of the presentation as you read it; refused (409) when it changed meanwhile.
remove_extraNoWith "into": remove the slides of the presentation after the last slide of the file (default false).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlNoThe address people open in a browser.
langNoThe language its texts are written in; "tr" holds the others.
slugYesThe address of the presentation: /movie/<slug>/.
ownerNoUser name of the author.
themeNo
titleNo
accessNoopen, public or private.
slidesYes
projectNoThe project it belongs to, or null.
updatedNo
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
can_editNoWhether you may change it.
databaseNoSetup scripts of the databases of runnable code blocks (shown to the author only).
title_trNoThe same text in the other languages of the site: {"en": "..."}.
warningsNoWhat could not be converted.
languagesNoThe languages of the site.
cover_slideNoId of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).
descriptionNo
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

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, idempotent=false, openWorld=false). The description goes well beyond: it discloses the returned 'warnings', the brief/full response distinction, the slide-N replacement semantics that preserve id/links/notes/history, preservation of translations, title/theme/slide-name/script retention, and a 409 refusal on version conflict. This is unusually rich 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.

Conciseness4/5

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

Two dense paragraphs, front-loaded with the create path before the 'into' update path, which is the right ordering. Almost every clause carries information; length is justified by 11 parameters and two distinct modes, though it could be tightened slightly.

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 the key output cues (ids unless 'full', warnings). For an 11-parameter import tool with an update mode, it covers both modes, edge cases, and the version-conflict guard, leaving nothing an agent needs 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 per-parameter baseline is 3. The description adds genuine cross-parameter meaning beyond the schema: how 'into' interacts with 'slides' (slide N replaces slide N, file slides after the last are added), what 'base_version' guards against (409), and what 'response' changes. It does not re-explain every field, but the interaction semantics are real added value.

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 presentation) constrained to two file formats (.pptx, .zip as exported by the site), and enumerates what becomes editable (slides, texts, shapes, pictures, backgrounds, links). It is clearly distinguished from a blank-create sibling because it is scoped to file import, and it names the second mode ('into') without ambiguity.

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 clearly explains the two usage modes: no 'into' creates a new presentation, and with 'into' the file updates an existing one. Context is strong, but no alternative sibling (e.g. create_presentation or upload_image) is named as a 'when not to use this' option, so the routing guidance stops short of explicit exclusivity.

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

list_access_requestsAccess requestsC
Read-onlyIdempotent
Inspect

"incoming" (default): requests for access to YOUR presentations (pending ones, or all with include_decided); "outgoing": the requests you (or your agents) sent and their status.

ParametersJSON Schema
NameRequiredDescriptionDefault
directionNo"incoming" (default): requests to you; "outgoing": requests you sent.
include_decidedNoAlso return approved and declined requests.

Output Schema

ParametersJSON Schema
NameRequiredDescription
requestsYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds one genuinely useful behavioral fact beyond that: by default only pending requests are returned unless include_decided is set. It says nothing about ordering, limits, or pagination.

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

Conciseness4/5

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

Two short, front-loaded sentences with no filler. Slightly awkward quoting and punctuation, but every clause carries information and nothing is padded.

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

Completeness3/5

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

An output schema exists so return values need no explanation, and annotations carry the safety profile. However, for a list tool sitting among 40 siblings with closely related request/access tools, the description omits the basic purpose statement and any routing, leaving the definition only minimally 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 description coverage is 100%, and the description essentially paraphrases the schema text for both parameters ("incoming" default, include_decided behavior) rather than adding format or edge-case meaning. Baseline 3 is appropriate when the schema already does this work.

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

Purpose3/5

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

The description never states that this tool lists access requests in a sentence of its own; it jumps straight into the meaning of the "direction" parameter values. The tool name carries the actual purpose, and the description only clarifies scope (incoming vs outgoing). It is decipherable but the verb+resource statement is implied rather than stated, and no sibling (e.g. get_access, request_access) is distinguished.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no mention of alternatives. An agent must infer from context whether to call this versus get_access, request_access, or answer_access_request. The "default" note for incoming is a small hint but not routing guidance.

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

list_commentsRead the notesA
Read-onlyIdempotent
Inspect

Notes on a presentation, as threads with replies. The owner sees every note; anybody else sees the threads they started (and the replies to them). Without "include_resolved" only open threads.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
slide_idNoThe id of a slide (stable, the "id" of the slide in the presentation). Its number (position) changes when slides are reordered.
include_resolvedNoAlso return resolved threads (default: only open ones).

Output Schema

ParametersJSON Schema
NameRequiredDescription
commentsYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds genuinely non-obvious behavior beyond the annotations: per-user visibility scoping and the default that resolved threads are excluded unless include_resolved is set.

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 short sentences with no filler and the core resource description front-loaded. The final sentence is telegraphic but still readable and earns its place by stating the default filter.

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, return-value details need not be described, and the description covers scope, visibility, and default filtering adequately for a three-parameter read tool. Nothing essential to correct invocation appears 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 a baseline of 3 applies. The description goes slightly beyond the schema by clarifying the default filtering semantics of include_resolved ("Without include_resolved only open threads"), which reinforces the meaning of that parameter rather than merely restating it.

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

Purpose4/5

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

Describes the resource as notes on a presentation returned as threads with replies, which is specific enough to distinguish it from siblings like add_comment, delete_comment, and resolve_comment. The verb is only implied by the title ("Read the notes") rather than stated in the description, but the resource scope is unambiguous.

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

Usage Guidelines3/5

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

Explains who sees what (owner sees every note, others see only their own threads) and the default filtering of resolved threads, which is useful context for deciding relevance. However, it never explicitly routes the agent away from alternatives such as get_slide or read_presentation, so usage is implied rather than stated.

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

list_historyHistory of changesA
Read-onlyIdempotent
Inspect

The versions of a presentation you may edit, newest first: number, who made it (person and agent), when, and what changed. Changes of one author in a row within 10 minutes are one version. Those who may only read a presentation do not see its history.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
limitNoAt most this many (default 50).

Output Schema

ParametersJSON Schema
NameRequiredDescription
versionsYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive and closed-world behavior, so the bar is lower, and the description still adds real semantics beyond them: the newest-first ordering, the non-obvious aggregation rule (one author's consecutive changes within 10 minutes collapse to a single version), and the permission-based visibility rule. It omits pagination/limit behavior, but the added behavioral context is substantive.

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, each carrying distinct information, front-loaded with the resource and its ordering. There is no filler; the only slight cost is that the opening sentence is dense with the returned-field list.

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 explained in prose, and the description still covers ordering, the version-grouping rule, and the visibility constraint. For a two-parameter read-only list tool this is nearly complete; only pagination behavior around limit is left unstated.

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 slug and limit fully documented in the schema (including the default of 50). The description adds no extra meaning to either parameter, so the baseline of 3 applies.

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

Purpose4/5

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

The description states a specific resource and its scope: versions of a presentation the caller may edit, returned newest first, with the fields it exposes (number, author, timestamp, diff). It is clear and distinguishable, but it never names or contrasts with the closely related siblings get_version and restore_version, so sibling differentiation is left to inference.

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

Usage Guidelines3/5

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

Usage context is implied rather than stated: it tells you the history is only visible to those who can edit, which implicitly routes read-only users away. However, it gives no explicit guidance on when to call this versus get_version (single version) or restore_version (revert), so the agent must infer the boundary.

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

list_presentationsList presentationsA
Read-onlyIdempotent
Inspect

Presentations: "mine" (default) -- yours; "shared" -- other people's that you were given access to; "open" -- open presentations of anybody, which every signed-in person or agent may read and edit. Each has slug, id, title, description, theme, access level, whether you can edit it, number of slides, address and its project (if any).

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoWhich presentations: "mine" (default), "shared" with you, or "open" ones of anybody.
projectNoOnly the presentations of this project (its slug), in its order; "scope" is then ignored.

Output Schema

ParametersJSON Schema
NameRequiredDescription
presentationsYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, lowering the bar. The description adds useful access semantics beyond that – notably that 'open' presentations may be read and edited by any signed-in person or agent, and that each record exposes an editability flag and access level, which helps the agent reason about permissions.

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 scope definitions the agent needs first, then the field inventory. It is appropriately sized, though the field-list sentence reads as a run-on inventory rather than clearly separated clauses.

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 field enumeration is partly redundant, but the access-level/editability semantics and scope meanings round out the picture. Nothing critical for a filtered, read-only list call is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (scope, project) are fully documented in the schema, including the note that project overrides scope. The description largely restates the scope enum without adding syntax or precedence detail beyond what the schema already provides, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource ('List presentations') and immediately defines the three scopes it can return, so an agent knows exactly what the tool yields. It doesn't explicitly contrast itself with get_presentation or the other list_* siblings, but the resource noun is distinctive enough to avoid confusion.

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 scope definitions tell the agent which filter to pick and which is default ('mine' default, 'shared' = granted access, 'open' = anyone can read/edit). There's no explicit 'use this instead of X' routing to get_presentation, but the when-to-use context is clear from the scope semantics.

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

list_projectsList projectsB
Read-onlyIdempotent
Inspect

Projects: presentations that belong together (a course, a series of lessons). Yours and those of other people that you were given access to, each with its presentations in order. Blocks may lead to the slides of the other presentations of the same project, and only of it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
projectsYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds useful scope context (your projects plus those you were granted access to, with presentations in order), but the trailing sentence about blocks leading to slides of other presentations is confusing and does not clearly describe this tool's behavior.

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 domain definition is front-loaded, which is reasonable, but the last sentence is opaque and arguably off-topic for a list operation, diluting otherwise compact prose.

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

Completeness3/5

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

With an output schema present and rich annotations, the description is not required to explain return values or safety, and it does supply the access scope. However, it omits any routing information among the many sibling tools and ends with a sentence that confuses rather than completes the picture.

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 there is nothing for the description to disambiguate. Baseline 4 applies for a parameterless tool.

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

Purpose3/5

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

The description defines what a project is ('presentations that belong together') and describes the scope of what is returned, but never states the action verb directly — the listing behavior is carried entirely by the name/title. It also does not distinguish this tool from siblings like get_project or list_presentations, so the agent must infer the distinction from naming alone.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no alternative named; nothing tells the agent to prefer get_project for a single project or list_presentations for presentations. The access-scope sentence implies coverage but not when this call is appropriate.

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

name_slides_after_titlesName the slides after their titlesAInspect

Give every slide of a presentation you may edit the name of its title: the text block with the biggest letters (the highest one of those), in every language it is written in. Slides whose names were set by hand get the title too; slides without text keep theirs. From then on a slide named after its title keeps following it when the title changes. Returns the renamed slides.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).

Output Schema

ParametersJSON Schema
NameRequiredDescription
renamedYesThe slides that got the name of their title.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare it is a write (readOnlyHint=false), non-idempotent, and non-destructive, but the description adds genuinely new behavior: manually-set names are overwritten, slides without text are left alone, and the new name persists and re-follows later title changes. Disclosing the overwrite of hand-set names is valuable context beyond the safety hints, though it stops short of stating auth specifics or exact return shape.

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 behavior is front-loaded, but the prose is convoluted, especially 'the text block with the biggest letters (the highest one of those)', which forces the agent to parse a nested clarification. Every sentence carries information, but the structure is denser and more awkward than needed.

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 single-parameter write tool with an output schema present, the description gives a thorough account of the algorithm, its persistence behavior, and its edge cases (hand-named slides, textless slides). The main remaining gap is the absence of explicit usage/alternative guidance, which is minor given the detailed behavior.

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 single slug parameter is fully documented in the schema (100% coverage), including its /movie/<slug>/ format. The description adds no syntax or meaning beyond that, so the baseline 3 for schema-driven parameters applies.

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

Purpose4/5

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

The description names a specific verb (name) and resource (every slide of a presentation) and defines the mechanism precisely: the title is 'the text block with the biggest letters'. It is clearly distinguishable from generic siblings like update_slide or edit_slides, though it never explicitly contrasts itself with those.

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

Usage Guidelines3/5

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

Usage is only implied via the prerequisite 'a presentation you may edit', which conveys a permission requirement but not an explicit when-to-use or when-not-to-use rule. No alternative (e.g. update_slide) is named or routed to, so the agent must infer placement from the sibling list.

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

preview_slidesSee slides as picturesA
Read-onlyIdempotent
Inspect

Pictures (PNG) of slides exactly as viewers see them, drawn by a browser on the server: check that the texts fit their blocks, that blocks do not lie over each other and that the slide looks right. At most 6 slides per call: the first ones of "slide_ids" or of "from_number".."to_number" (slide 1 by default). Every picture is "width" px wide. The answer also has the "layout_warnings" of those slides, measured in the same browser.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage of the texts on the pictures (default: the language of the presentation).
slugYesThe presentation's slug (its address: /movie/<slug>/).
widthNoWidth of the pictures in px (default 960; more shows small text better, but a picture costs more to look at).
slide_idsNoOnly these slides (ids).
to_numberNoOnly the slides up to this number (inclusive).
from_numberNoOnly the slides from this number on (1-based).

Output Schema

ParametersJSON Schema
NameRequiredDescription
moreNoSlides asked for but not drawn (ask for them in another call).
slidesYes
slides_totalNo
layout_warningsNoHow the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, non-open-world), so the bar is lower. The description adds real context: rendering is done by a server-side browser, there is a hard 6-slide cap per call, selection prefers the first ids/ranges, and layout_warnings are returned from the same render.

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 purpose, then constraints and parameter behavior. Dense but every sentence carries information; no filler or restatement of the name.

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?

Output schema covers return values, yet the description still usefully notes that layout_warnings accompany the pictures. For a read-only 6-parameter tool with full schema coverage and an output schema, 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.

Parameters4/5

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

Schema coverage is 100% so 3 is the baseline, but the description goes further by explaining the precedence between slide_ids and from_number..to_number, the slide-1 default, and the meaning of width in px. This interaction logic is not captured in the per-parameter schema text.

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 PNG pictures of slides exactly as viewers see them) and the reason it exists (check text fits blocks, blocks don't overlap). An agent can distinguish this from siblings like check_layout or get_slide 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?

Clearly frames the use case (visually verifying layout correctness) and gives an operational constraint (max 6 slides per call). It does not, however, explicitly name the alternative check_layout tool or state when to prefer a programmatic check over a visual preview.

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

read_presentationRead any presentationA
Read-onlyIdempotent
Inspect

Read any presentation you can see (not private, or shared with you) the way a person sees it: slide by slide, the texts in reading order, pictures' descriptions, code, and where every button or link leads. A card (a shape with a link and the blocks on it that lead to the same place) is one entry of type "card" with the ids of all its blocks. format "markdown" (default) is compact; "json" is structured.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoRead the texts in this language (default: the one it is written in); what is not translated shows in its own language.
slugYesThe presentation's slug (its address: /movie/<slug>/).
formatNoResult format: "markdown" (default, compact) or "json" (structured).
slide_idsNoOnly these slides (ids).
to_numberNoOnly the slides up to this number (inclusive).
from_numberNoOnly the slides from this number on (1-based).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNoThe address people open in a browser.
langNoThe language its texts are written in; "tr" holds the others.
slugNoThe address of the presentation: /movie/<slug>/.
ownerNoUser name of the author.
themeNo
titleNo
accessNoopen, public or private.
slidesNo
projectNoThe project it belongs to, or null.
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
can_editNoWhether you may change it.
markdownNo
title_trNoThe same text in the other languages of the site: {"en": "..."}.
languagesNoThe languages of the site.
shown_langNoThe language of the texts shown.
cover_slideNoId of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).
descriptionNo
slides_totalNoSlides of the whole presentation (a part may be shown).
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral value by describing the nature of the returned content (person-like slide-by-slide reading, image descriptions, link destinations, and the 'card' aggregation concept), which goes beyond the annotation set.

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 action and appropriately sized for a rich read tool. The parenthetical defining a 'card' is slightly tangential but earns its place by explaining a json output entry type.

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 need not enumerate return values, yet it still conveys the shape of the content and the format trade-off. Combined with complete annotations and full schema coverage, an agent has enough to invoke it correctly; only sibling disambiguation 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% and every parameter (lang, slug, format, slide_ids, from_number, to_number) is documented in the schema itself. The description only restates the markdown-vs-json format distinction and the card concept, adding no syntax or behavioral detail beyond the structured fields, so 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?

The description states a specific verb (read) and resource (presentation) and details exactly what 'reading' yields: slide-by-slide text in reading order, picture descriptions, code, and link targets. It is clear and concrete, but never names the obvious competing siblings (get_presentation, preview_slides, get_slide, export_presentation), so an agent cannot tell from the description alone why it should prefer this 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?

It gives an access precondition ('any presentation you can see (not private, or shared with you)'), which is useful scoping, but there is no explicit when-to-use-vs-alternative guidance despite several overlapping read tools in the sibling list. Usage is implied rather than stated.

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

reorder_slidesReorder slidesA
Idempotent
Inspect

Set the playback order: "order" lists the ids of ALL slides of the presentation in the new order.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
orderYesEvery slide id, once.

Output Schema

ParametersJSON Schema
NameRequiredDescription
orderYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare this is a non-readonly but non-destructive, idempotent mutation. The description adds genuinely useful behavioral context beyond that: the order array must contain ALL slides, implying full-replacement semantics where a partial list is invalid. It still does not say what happens if ids are missing or repeated (error vs. silent drop), which is the main remaining 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?

A single compact sentence that front-loads the action ('Set the playback order') and then explains the key parameter. The nested colon-and-quotes construction is slightly awkward but wastes no 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?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. For a two-parameter idempotent mutation the description covers the essential constraint, leaving only the failure behavior for incomplete or invalid orders unstated.

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 both parameters are documented in the schema, including 'Every slide id, once.' The description reinforces the same completeness constraint on 'order' but adds no new syntax, format, or edge-case detail, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb and resource: set the playback order of a presentation's slides, identified by slug and an id list. It is clearly distinct from siblings like add_slide, delete_slide, and edit_slides, though it never names those alternatives explicitly.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance, no mention of prerequisites (e.g., needing the presentation to exist, or permissions), and no routing to alternative tools such as edit_slides for non-order edits. Usage is only inferable from the verb itself.

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

replace_textFind and replaceAInspect

Find and replace words in a whole presentation you may edit, in one step: the texts of text, shape and button blocks (in every language by default, or only "langs"), the slide names, and with "in_code": true the code of code blocks. Formatting stays (the words are replaced inside it; a phrase split by formatting, like half of it bold, is not found). The number of an automatic slide reference ({{slide:N}}) is not text and is not found: it changes by itself when slides move; to point a reference to another slide, write the block's html with a new {{slide:N}}. "regex": true makes "find" a Python regular expression ("replace" may use \1). "dry_run": true only counts. Returns how many were replaced on which slides.

ParametersJSON Schema
NameRequiredDescriptionDefault
findYesWhat to find (at most 500 characters).
slugYesThe presentation's slug (its address: /movie/<slug>/).
langsNoOnly these languages of the texts (default: all).
regexNo"find" is a regular expression (default: plain text).
dry_runNoOnly count, change nothing.
in_codeNoThe code of code blocks too (default: false).
replaceYesWhat to put instead (may be empty).
in_namesNoThe names of the slides too (default: true).
slide_idsNoOnly these slides (ids).
to_numberNoOnly the slides up to this number (inclusive).
match_caseNoCase matters (default: true).
from_numberNoOnly the slides from this number on (1-based).
base_versionNoOptional: the "version" of the presentation as you read it; refused when it changed meanwhile.

Output Schema

ParametersJSON Schema
NameRequiredDescription
slidesYes
dry_runNo
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
replacedYesHow many places were (or, with dry_run, would be) changed.
layout_warningsNoHow the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).

TDQS

A4.6/5.0
Behavior5/5

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

Despite annotations covering the safety profile, the description adds substantial non-obvious behavior: formatting is preserved, phrases split by formatting are not matched, {{slide:N}} references are immune to replacement, and dry_run changes nothing. The extraction-by-formatting caveat and reference-number caveat are exactly the kind of hidden traits that prevent misuse.

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 purpose is front-loaded in the first clause, then productive caveats follow. It is dense with quoted parameter names and parentheticals, which costs a little readability, but every sentence carries useful 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?

For a 13-parameter mutation tool with 100% schema coverage, full annotations, and an output schema, the description fills the remaining gaps: return summary ('how many were replaced on which slides') and the tricky matching invariants. Nothing an agent needs to invoke it correctly is missing.

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

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 semantics the schema lacks, notably that regex mode allows \1 backreferences in the replacement and that langs defaults to all languages. This elevates it slightly above the schema-only baseline.

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 states a precise verb (find and replace) plus the exact scope: text/shape/button blocks, slide names, and code blocks within a whole presentation in one step. This clearly separates it from the per-block/per-slide editors like edit_blocks and edit_slides.

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 conveys context clearly (whole-presentation bulk replace, dry_run to only count, regex mode) and even states when matching will fail (formatting-split phrases, {{slide:N}} references). It stops short of explicitly naming alternative tools for narrower edits, so not a full 5.

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

request_accessAsk for accessAInspect

Ask the author of a presentation for access: "view" to read a private one, "edit" to change one that is not open. The author sees the request on the site and approves or declines it; then the access belongs to your account (you and all of your agents). Asking again updates the pending request.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNo"view" -- read; "edit" -- read and change.
slugYesThe presentation's slug (its address: /movie/<slug>/).
messageNoWhy you need it (optional).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
roleNoview or edit.
userNoWho asks.
agentNo
titleNo
statusYespending, approved or declined.
messageNo
projectNoSlug of the project, for access to all of it.
created_atNoISO 8601 date and time.
presentationNoSlug of the presentation (null: a project).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only declare the generic read/write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false); the description adds the substantially more useful behavioral facts: the author approves or declines out-of-band, the granted access attaches to the account rather than the session, and a repeat call updates the pending request rather than erroring. That last point is consistent with idempotentHint=false.

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 purpose, then mechanics, then the account-scoping and re-ask behavior. Nothing is padding, though the role recap in sentence one mildly duplicates the schema's enum descriptions.

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, return values need not be described, and the description covers the async approval loop and the account-wide effect of a granted request. It omits edge cases such as already holding the requested role or requesting access to a slug that does not exist, 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?

Schema description coverage is 100%, so the schema already documents slug, role and message, including the enum glosses. The description restates the role semantics ("view" to read, "edit" to change) in prose but adds no format, constraint, or syntax beyond what the schema carries; baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (ask the author of a presentation for access) plus the two access levels it can request. It is clearly distinguishable from the sibling request_project_access, which targets a different resource, so 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 Guidelines4/5

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

Explains the condition that selects each role value ("view" to read a private one, "edit" to change one that is not open), which is genuine when-to-use guidance. It does not name alternatives such as get_access or request_project_access, nor say what to do if access already exists, so it stops 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.

request_project_accessAsk for access to a projectAInspect

Ask the author of a project for access to all of it: "view" to read its private presentations, "edit" to change them. Approved access counts for every presentation of the project, also the ones added later.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNo"view" -- read; "edit" -- read and change.
messageNoWhy you need it (optional).
projectYesThe project's slug (its address: /project/<slug>/).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
roleNoview or edit.
userNoWho asks.
agentNo
titleNo
statusYespending, approved or declined.
messageNo
projectNoSlug of the project, for access to all of it.
created_atNoISO 8601 date and time.
presentationNoSlug of the presentation (null: a project).

TDQS

A3.9/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), and the description adds genuinely non-obvious behavior: the grant is request-based (an author must approve) and, once approved, persists to presentations added later. It does not say how the request is surfaced to the author or what happens while it is pending, which keeps it below 5.

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

Conciseness5/5

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

Two sentences, front-loaded with the action and target, then the role semantics, then the scope-of-approval consequence. No filler, no restatement of the title, and every clause carries information an agent needs.

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

Completeness4/5

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

With an output schema present, return values need not be described, and the description covers the action, both parameter effects, and the durable scope of the grant. It stops short of stating that access is not immediate (pending author approval) or how the requester learns of the outcome, which a request-style tool with idempotentHint=false would ideally clarify.

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 meaning beyond the enum labels: "view" grants read of private presentations rather than mere metadata visibility, and the role applies project-wide rather than to a single item. It says nothing about the optional message parameter, but the schema already documents it.

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

Purpose4/5

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

States a specific verb and resource (ask the project's author for access) and defines the scope of what is being requested, including that it covers every presentation of the project. It implicitly contrasts with the sibling request_access (per-presentation) via "access to all of it" and "counts for every presentation", but never names that sibling, so the differentiation is inference rather than explicit.

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

Usage Guidelines3/5

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

The description explains what the two roles mean and what approval grants (including future presentations), which implies when each role is appropriate. However, it gives no explicit when-to-use guidance relative to request_access, get_access, or set_access, and no preconditions such as needing to know the project slug or that a human must approve.

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

resolve_commentResolve a noteAInspect

Mark a thread as done (or open it again with "resolved": false). The owner of the presentation or the one who started the thread may do it.

ParametersJSON Schema
NameRequiredDescriptionDefault
resolvedNoDefault true.
comment_idYesThe id of a note.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
resolvedYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations say destructiveHint=false and readOnlyHint=false; the description adds the authorization rule (who may resolve), which is exactly the kind of context annotations don't carry. It doesn't mention idempotency or reversibility explicitly, though the resolved:false path implies reversibility.

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

Conciseness4/5

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

Two short sentences: action + toggle first, permission rule second. Nothing wasted, though the permission clause is slightly under-integrated.

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 two-parameter toggle with an output schema and full annotation coverage, the description covers what it does, the reopen path, and who can call it. Return values are covered by the output schema; idempotency behavior is the only minor gap.

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 schema already documents both comment_id and resolved (including the default true). The description restates the resolved:false toggle, adding a little semantic framing but nothing beyond the schema. Baseline 3.

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

Purpose4/5

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

States a specific verb (mark) and resource (a thread/note), and clarifies the toggle to reopen via resolved:false. Toggling resolve vs. open is distinguishable from sibling delete_comment or add_comment, though it doesn't explicitly contrast with them by name.

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?

Conveys the permission model – owner of the presentation or thread starter may do it – which is a real usage constraint. But it doesn't explicitly say when to choose resolve vs. reopen beyond the parameter flip, and names no alternative tools.

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

restore_versionGo back to a versionAInspect

Make a presentation you may edit look exactly as it did in a version (slides, blocks, order, title). The restore is a new version itself, so it can be undone the same way.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
numberYesThe version number.

Output Schema

ParametersJSON Schema
NameRequiredDescription
versionNo
restoredYesThe version that was brought back.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only give the generic mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds genuinely new behavioral context: the restore is itself a new version, so it is undoable the same way, and an edit permission is implied. That is useful disclosure beyond the structured fields, though auth requirements and failure modes remain unstated.

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

Conciseness5/5

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

Two short sentences, front-loaded with the action and scope, then the reversibility caveat. Every clause earns its place with no redundancy.

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

Completeness4/5

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

With annotations covering the safety profile and an output schema covering return values, the description supplies the key missing piece (undo semantics) and the edit precondition. It is complete enough to call correctly, with only minor gaps around permissions and error behavior.

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% (slug and number both documented in-schema), so the schema carries the parameter burden. The description adds no format or constraint 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.

Purpose4/5

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

States a specific verb ('make ... look exactly as it did') and resource (a presentation version), and enumerates the restored scope (slides, blocks, order, title). An agent can distinguish it from read-only siblings like get_version or list_history, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

'A presentation you may edit' implies an edit-permission precondition, and the tool's role (reverting to a prior version) is inferable from context. However, there is no explicit when-to-use guidance, no statement of when to prefer it over update_presentation/edit_slides, and no exclusions.

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

run_codeRun codeAInspect

Run code the way the Run button of a code block does, to check it: "sql", "mongodb", "redis" and "clickhouse" run in your own database of the presentation (made from its database scripts; what you change stays in it), "python" and "bash" in a sandbox without network that keeps nothing. The presentation itself does not change.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe code (at most 20000 characters).
langYesLanguage of the code.
slugYesThe presentation's slug (its address: /movie/<slug>/).
resetNosql, mongodb, redis, clickhouse: first make your database again from the script of the presentation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
langYes
stderrNo
stdoutNo
noticesNo
omittedNo
resultsNo
exit_codeNo
sql_errorNo
timed_outNo
elapsed_msNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only give generic hints (readOnlyHint=false, idempotentHint=false); the description adds the crucial side-effect model: sql/mongodb/redis/clickhouse mutate a persistent presentation-scoped database ('what you change stays in it'), while python/bash run sandboxed with no network and no retention. It also explicitly reassures the presentation itself is untouched, which is high-value context beyond 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?

Densely packed and front-loaded with the purpose, and nearly every clause carries information (language groups, persistence, sandbox, presentation safety). It is a single run-on sentence that would be easier to parse if split, which 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 described, and annotations plus the description together cover the safety and side-effect profile. For a code-execution tool the agent has everything needed: what runs, where it runs, what persists, and what is left untouched.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it partitions the lang enum into two groups with distinct execution and persistence semantics that the schema's bare 'Language of the code.' does not convey. The reset parameter's effect is only covered by the schema, not the description, keeping it from a 5.

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 ('Run code the way the Run button of a code block does') and immediately scopes the intent ('to check it'). No sibling tool executes code, and the description makes that distinct role obvious 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 Guidelines4/5

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

The stated purpose ('to check it') clearly frames the use case for verification, and the language groups imply when each mode is appropriate. It offers no explicit when-not or named alternatives, but the tool is unique enough among siblings that this is a minor gap.

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

set_accessChange accessAInspect

Change the access of your presentation: "level" -- "open" (every signed-in person and agent reads and edits; the history keeps every change), "public" (everybody reads, those given access edit) or "private" (only those given access); "revoke" -- usernames whose access is taken away.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
levelNoNew access level: "open", "public" or "private".
revokeNoUser names whose access is taken away.

Output Schema

ParametersJSON Schema
NameRequiredDescription
levelYesopen, public or private: the presentation's own level.
grantsNo
project_levelNoThe level of its project, if any.
effective_levelNoThe level that counts (the project's one when stricter).
pending_requestsNo

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructive=false and idempotent=false, so the safety profile is covered. The description adds real behavioral context beyond that: 'open' makes the history keep every change, 'public' separates read from edit rights, and 'revoke' strips usernames of access. It still omits prerequisites (e.g. owner-only) and reversibility.

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?

One front-loaded sentence that leads with the verb and resource before drilling into the level semantics. The quote-and-dash formatting is slightly dense but every clause carries information; nothing is wasted.

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, return values need not be described, and annotations cover the safety profile. The description covers purpose and all three parameters, though it leaves prerequisites and the interaction between setting a level and pre-existing grants unaddressed.

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 genuinely adds meaning the schema lacks: the schema only labels the enum values, while the description spells out who can read/edit under each level and the history side effect. This is useful semantic elaboration beyond the structured fields.

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

Purpose4/5

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

States a specific verb and resource: 'Change the access of your presentation', so the agent knows this is the mutator for presentation access. It does not explicitly contrast itself with siblings like get_access or request_access, but the verb+resource is unambiguous.

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

Usage Guidelines2/5

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

The description never says when to use this tool versus alternatives such as get_access (read), request_access (ask for access) or answer_access_request. The level explanations describe parameter values, not tool-selection guidance, so an agent gets no routing help from the text.

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

set_languageChange the language of a presentationAInspect

Say which language the texts of a presentation you may edit are written in, when the site guessed it wrong (all its texts are Russian, but it was made English). Every text, slide name and the title is put right: where a translation into the new language exists, it becomes the text and the text becomes the translation into the old language; texts that are in the new language already stay; the ones that are in neither are listed as "untranslated". Returns the counts and what is still to translate.

ParametersJSON Schema
NameRequiredDescriptionDefault
langYesThe language the texts are written in.
slugYesThe presentation's slug (its address: /movie/<slug>/).

Output Schema

ParametersJSON Schema
NameRequiredDescription
keptNoTexts that were in the language already.
langYes
swappedNoTexts whose translation became the text.
untranslatedNoTexts in neither language.
previous_langNo
untranslated_blocksNoThe first of those blocks.
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already disclose readOnly=false, destructive=false and idempotent=false, and the description goes well beyond them. It explains exactly what happens to existing texts: translations are swapped, already-correct texts stay, and untranslated ones are listed. It also notes that counts and remaining translations are returned, giving strong behavioral context for a mutation tool.

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 the trigger condition and then explains the effects in a logical sequence. It is somewhat verbose and contains a parenthetical example that lengthens it, but every sentence contributes useful semantics for a complex mutation. It avoids repetition and unnecessary fields.

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 the description need not detail return values, though it briefly mentions counts and untranslated items. Given the mutation's complexity, it covers what is changed and when to use it. The main remaining gap is that it does not reference the related translate_presentation sibling or other alternatives.

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 descriptions in the schema. The description adds little parameter-level detail beyond what the schema already provides, so the baseline for high coverage is appropriate. It does not, for example, clarify slug format or the lang enum beyond the schema.

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

Purpose4/5

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

The description states a specific verb and resource: declaring/repairing the language of a presentation's texts, slide names and title. It clearly distinguishes the operation from a simple metadata update by explaining the translation-swapping behavior. It does not explicitly name sibling tools such as translate_presentation, so sibling differentiation is helpful but not explicit.

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

Usage Guidelines4/5

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

It gives a clear condition for use: 'when the site guessed it wrong.' That is a concrete trigger and implies the tool is for correcting an incorrect language guess rather than general translation. It does not name an alternative or state when not to use it, so it falls just short of full routing guidance.

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

translate_presentationTranslate what is not translatedAInspect

Fill in, by machine translation, the texts of a presentation you may edit that have no translation into the other languages of the site yet: the title, the slide names and the texts of text, shape and button blocks. Translations a person or an agent wrote stay as they are; machine translations whose source text changed are made again. The site does this by itself a few seconds after every change when it has a translator; this does it now and says how many. Answers 503 when the site has no translator.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).

Output Schema

ParametersJSON Schema
NameRequiredDescription
translatedYesTranslations made now.
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: human/agent-authored translations are preserved while stale machine translations are regenerated, and the tool returns a count and answers 503 when no translator exists. This discloses what is mutated, what is protected, and error behavior, all consistent with the write/non-idempotent 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?

Front-loads the core purpose and then adds preservation, timing, and error facts, each earning its place. It is somewhat dense and run-on but contains 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 an output schema present, return values need not be explained, and the description already notes it 'says how many.' Combined with mutation scope, preservation rules, automatic-vs-manual timing, and the 503 condition, 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?

Only one parameter with 100% schema coverage; the schema already documents the slug fully (its address /movie/<slug>/). The description adds no syntax or format detail beyond that, so the baseline 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?

States a specific verb ('fill in, by machine translation') and precisely scopes the resource: title, slide names, and text/shape/button block texts of a presentation. No sibling tool performs translation, and the description makes clear it targets untranslated texts only, so an agent can distinguish it immediately.

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 clear context for when to invoke: the site already does this automatically a few seconds after every change, so calling this tool means 'do it now.' That implicitly guides the agent toward manual use, though it never states an explicit when-not condition or names an alternative tool.

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

update_presentationChange title, description, theme or databaseAInspect

Change the title, description, theme or cover of a presentation you may edit, or (its author only) the setup scripts of the databases its runnable code blocks work in. The theme only sets the defaults of new slides and blocks; existing slides keep their colours. The slug (address) does not change.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe presentation's slug (its address: /movie/<slug>/).
themeNoColour theme: the defaults of new slides and blocks.
titleNoNew title (at most 100 characters).
databaseNoSetup scripts of the databases the runnable code blocks work in, by language. Every viewer runs the blocks in a private database made from the script (up to 50000 characters each; an empty string removes a script). Only the author may change them; the languages left out keep their scripts.
title_trNoThe title in the other languages of the site: {"en": "..."} (the languages left out keep theirs).
cover_slideNoId of the slide shown as the cover of the presentation in the lists of presentations; null: the first slide, whichever it is (the default).
descriptionNoNew description; an empty string removes it.
names_from_titlesNoName every slide after its title (the text block with the biggest letters, the highest one of those), in every language it is written in. From then on a slide named after its title keeps following it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlNoThe address people open in a browser.
langNoThe language its texts are written in; "tr" holds the others.
slugYesThe address of the presentation: /movie/<slug>/.
ownerNoUser name of the author.
themeNo
titleYes
accessNoopen, public or private.
slidesNoNumber of slides.
projectNoThe project it belongs to, or null.
renamedNoSlides that got the name of their title.
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
can_editNoWhether you may change it.
databaseNoSetup scripts of the databases of runnable code blocks (shown to the author only).
title_trNoThe same text in the other languages of the site: {"en": "..."}.
languagesNoThe languages of the site.
cover_slideNoId of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).
descriptionNo
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) by disclosing non-obvious semantics: the theme only affects new slides/blocks and not existing ones, the slug never changes, omitted languages keep their scripts, and an empty string removes a script. It also surfaces the permission model (author-only for database scripts, edit rights otherwise).

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 full set of changeable fields, followed only by two genuinely informative clarifications about theme scope and slug immutability. No filler or repetition.

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 an 8-parameter mutation tool with nested objects, an output schema, and 100% schema coverage, the description covers the important behaviors and constraints. It omits mention of title_tr and names_from_titles, but those are fully documented in the schema, so the gap is minor.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already explains each field in depth (theme defaults, per-language database scripts, empty-string removal, cover_slide null meaning). The description's theme and slug notes largely restate what the schema says, so it adds little parameter-level meaning beyond the baseline.

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

Purpose5/5

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

States a specific verb (change) plus the exact resources it mutates: title, description, theme, cover, and database setup scripts of a presentation. This clearly separates it from update_slide, edit_slides, edit_blocks, and update_project without the agent needing to open schemas.

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 a real precondition — the presentation must be one 'you may edit', and the database scripts are changeable by 'its author only' — which tells the agent when the call will succeed. It does not, however, name alternatives or say when not to use this tool (e.g. versus name_slides_after_titles, which overlaps the names_from_titles parameter).

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

update_projectChange a projectAInspect

Change a project of yours: its title and description, which presentations are in it ("add" puts presentations of yours at its end, "remove" makes them presentations on their own again) and their order ("order": the slugs of all of its presentations). Links between presentations work only inside a project: a removed presentation's links to the others stop leading anywhere. Access: "access" is the level of the project, which its presentations inherit (the stricter of the project's and the presentation's own level counts); "grant" gives people access to all of it ({"user": name, "role": "view"|"edit"}), "revoke" takes it away (user names).

ParametersJSON Schema
NameRequiredDescriptionDefault
addNoSlugs of presentations.
grantNoGive access to the whole project: [{"user": <user name>, "role": "view"|"edit"}].
orderNoSlugs of all the presentations of the project, in the new order.
titleNoNew title.
accessNoLevel of the project: "open", "public" or "private".
removeNoSlugs of presentations.
revokeNoUser names whose access is taken away.
projectYesThe project's slug (its address: /project/<slug>/).
descriptionNoNew description.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlNoThe address people open in a browser.
roleNoowner, edit, view or null.
slugYesThe address of the project: /project/<slug>/.
ownerNo
titleYes
accessNoopen, public or private: inherited by its presentations.
grantsNoWho was given access (the owner sees it).
is_ownerNo
descriptionNo
presentationsNoIts presentations, in order.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare readOnly=false, destructive=false, idempotent=false, so the safety profile is covered; the description adds genuine context beyond them: links between presentations only work inside a project and a removed presentation's links stop leading anywhere, and access is inherited with the stricter of project/presentation levels winning. "remove" being re-parenting rather than deletion is consistent with destructiveHint=false. Error/conflict behavior on duplicate slugs or invalid order is still unstated.

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?

Every clause carries semantics, and the tool's core action is front-loaded. However it is delivered as one dense run-on paragraph with nested quotes and parentheses, mixing several parameters in prose, which hurts scannability for an agent parsing parameter behavior.

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

Completeness4/5

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

All nine parameters are addressed and an output schema exists, so return values need not be explained. For a mutation tool, what remains thin is preconditions (what role the caller needs) and failure modes, but the operational semantics of every mutator are otherwise covered.

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 adds real meaning on top: "order" must contain the slugs of ALL the project's presentations, "add" appends at the end, "remove" re-parents rather than deletes, and "access" is inherited by presentations under a strictest-wins rule. "grant" role format is repeated from the schema, which adds little.

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?

Opens with a concrete verb+resource ("Change a project of yours") and enumerates the mutable facets: title, description, contained presentations, their order, and access. The scope is precise, though it never names update_presentation, the sibling whose title/description editing overlaps, leaving the boundary to be inferred.

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

Usage Guidelines3/5

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

Usage of each sub-operation is described functionally ("add" puts presentations at its end, "remove" makes them presentations on their own), so the semantics of each mode are implied. But there is no explicit when-to-use guidance, no statement of prerequisites (e.g. the caller's own role on the project), and no routing to update_presentation vs. set_access for overlapping needs.

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

update_slideChange a slideAInspect

Change a slide: its name, size, background colour / picture, entrance transition, and -- when "objects" is given -- its COMPLETE list of blocks: blocks with an existing "id" are kept (their props are merged with the given ones), blocks without an id are added, blocks not in the list are deleted. Returns the slide (ids only unless "response" is "full").

ParametersJSON Schema
NameRequiredDescriptionDefault
hNoCanvas height in px (default 720).
wNoCanvas width in px (200-4000, default 1280).
bgNoBackground colour, #rrggbb.
fitNoHow the background picture fits.
nameNoSlide name (at most 100 characters), in the language of the presentation.
slugYesThe presentation's slug (its address: /movie/<slug>/).
name_trNoThe slide name in the other languages of the site: {"en": "..."}.
objectsNoBlocks of the slide, bottom to top: [{"type": "text"|"shape"|"button"|"line"|"image"|"code", "props": {...}}]. Missing props take the presentation theme's defaults (every prop is described in the block format reference). A link to a slide of the same presentation may be given as {"kind": "slide", "slide_number": N}.
responseNo"brief" (default): only the ids, numbers and types of the slides and blocks; "full": every prop of every block too.
slide_idYesThe id of a slide (stable, the "id" of the slide in the presentation). Its number (position) changes when slides are reordered.
backgroundNoBackground picture: the "src" of an uploaded picture; null removes it.
transitionNoEntrance effect of this incoming slide (default: none).none
base_versionNoOptional: the "version" of the slide as you read it. The change is refused (409 conflict) when somebody changed the slide meanwhile, instead of overwriting their work.
transition_durationNoAnimation duration in milliseconds (100-3000, default 500); not auto advance. Values outside the range are clamped.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hNo
wNo
bgNo
idYesStable id of the slide.
fitNo
urlNoThe address people open in a browser.
nameNo
numberYes1-based position; changes when slides are reordered.
name_trNoThe same text in the other languages of the site: {"en": "..."}.
objectsYesBlocks, bottom to top ("props" only in the full form).
versionNoStamp of the content as it is now: give it back as "base_version" to change it only if nobody else did meanwhile.
backgroundNoThe "src" of the background picture, or null.
transitionNoEntrance effect of this incoming slide.
layout_warningsNoHow the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).
transition_durationNoAnimation milliseconds, not auto advance.
missing_translationsNoWhat is not translated yet into the other languages of the site (add it): the first ones; "missing_translations_count" says how many there are.
missing_translations_countNoHow many texts are not translated yet.

TDQS

A3.5/5.0
Behavior2/5

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

The description is genuinely informative: it discloses that omitted blocks are deleted and that id-bearing blocks are merged, which is exactly the kind of risk context that matters. However, it explicitly declares deletion of existing blocks while the annotations set destructiveHint=false, which per the MCP spec means 'only additive updates'. That is a direct inconsistency between the documented behavior and the structured safety hint, so the highest transparency marks cannot be given.

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

Conciseness5/5

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

Two sentences, front-loaded with the verb and the affected surface, then the one non-obvious rule (objects replacement) emphasized in caps. The em-dash aside is dense but every clause removes a genuine ambiguity; nothing is padding.

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 14-parameter mutation tool with nested objects and an output schema, the description covers the riskiest gaps (block replacement semantics, response verbosity) while correctly leaving scalar parameters to the exhaustive schema. It does not note the absence of an undo path or permission requirements, which keeps it short of a 5.

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

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 description earns above that by adding semantics the schema does not carry: the id-based merge, add, and delete rules for objects and the brief/full response switch. It adds real meaning on the one parameter (objects) whose behavior is most easily misused.

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

Purpose4/5

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

The description names a specific verb (change) and resource (a slide) and then enumerates the exact attributes under its control: name, size, background colour/picture, entrance transition, and the full block list. It is clear and scoped, but it never names a sibling (e.g. edit_blocks, edit_slides, update_presentation), so the agent gets no explicit routing help for the overlapping update tools.

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 explains one important usage condition -- that the objects parameter triggers whole-list replacement -- and hints at the response mode, but it never states when to prefer this tool over edit_blocks/edit_slides or what prerequisites exist. Usage is implied rather than stated.

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

upload_imageUpload a pictureAInspect

Store a picture (PNG, JPEG, GIF or WEBP, up to 25 MB, base64-encoded) and get its "src" for an image block or a slide background. Big pictures are scaled down to 2560 px.

ParametersJSON Schema
NameRequiredDescriptionDefault
data_base64YesThe file, base64 (a data: URL prefix is allowed).

Output Schema

ParametersJSON Schema
NameRequiredDescription
hNo
wNo
srcYesUse it as "src" of an image block or background.
urlNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructive=false, idempotent=false and openWorld=false. The description adds genuinely new behavioral context: accepted formats (PNG/JPEG/GIF/WEBP), a 25 MB ceiling, base64 encoding, and the non-obvious transformation that large images are downscaled to 2560 px. It omits auth/error behavior, so it stops 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.

Conciseness5/5

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

Two sentences, front-loaded with what is stored and what is returned, followed by the format/size constraints and the downscaling caveat. No filler and nothing repeated from structured fields.

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 single-parameter upload with an output schema covering the returned src, the description supplies everything an agent needs: input format, size cap, encoding, and the resolution transformation. Nothing required 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 coverage is 100% and there is only one parameter, so the baseline is 3; the schema already documents the base64 payload and the allowed data: URL prefix. The description nevertheless adds constraints absent from the schema (format whitelist, 25 MB size limit), which materially affects how the agent must prepare the value.

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?

Specific verb (store/upload) plus resource (a picture) plus the outcome (its "src" for an image block or slide background). No sibling tool performs image uploads, so this definition is unambiguous against the rest of the toolset without needing to name an alternative.

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

Usage Guidelines3/5

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

The description implies the use case by saying the returned src feeds an image block or slide background, which tells the agent roughly when to reach for it. However, it never states prerequisites or when-not to use it (e.g. whether it must precede edit_blocks or add_slide), so usage is only implied rather than explicit.

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

whoamiWho am IA
Read-onlyIdempotent
Inspect

Who the API key belongs to and what it may do: the user name, the name of the key and its access ("read" or "write").

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoName of the API key.
scopeYesread or write.
usernameYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, which fully covers the safety profile. The description adds that the response is scoped to the calling key and names the possible access values ('read' or 'write'), which is modest extra context but not deep behavioral disclosure.

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

Conciseness5/5

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

A single front-loaded sentence naming the subject (key owner, key name) and the payload (access level) with no filler. 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?

A zero-param read tool with an output schema and full annotation coverage needs little prose, and the description supplies the one thing worth surfacing for callers: that access is one of 'read' or 'write'. Only a slightly more explicit statement of the access model would make it exhaustive.

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 by baseline there is nothing for the description to document; it correctly avoids inventing parameter talk. No weakness here.

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

Purpose4/5

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

The description states precisely what the tool resolves: the identity behind the API key (user name, key name) and its access level. That is a clear resource with implied verb ('who am I'), though it never contrasts itself with siblings like get_access, so it earns a 4 rather than a 5.

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

Usage Guidelines3/5

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

Usage is implied by the identity-check nature of a zero-parameter tool, but the description gives no explicit when-to-use or when-not-to-use guidance and names no alternative (e.g., get_access, check_layout). Minimum viable, nothing misleading.

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. 3 tool updates
    • Changedcreate_presentation1 field changed
      • changedInput schema / properties / lang / description
        Previous value: -"The language \"title\", slide names and blocks' \"html\" are written in (default: Russian when they have Cyrillic letters, otherwise English)."New value: +"The language \"title\", slide names and blocks' \"html\" are written in (default: the one most of the words of the title, the slide names and the texts are in)."
    • Addedset_language
    • Addedtranslate_presentation
  2. 6 tool updates
    • Changedcheck_layout1 field changed
      • addedOutput schema / properties / measured
        Added value: +{
        +  "description": "The texts were measured in a browser (false: estimated).",
        +  "type": "boolean"
        +}
    • Changedcreate_presentation1 field changed
      • addedInput schema / properties / access
        Added value: +{
        +  "description": "Who sees it (default \"private\": only you, until you publish it; \"public\": everybody reads it; \"open\": every signed-in person edits it too).",
        +  "enum": [
        +    "open",
        +    "public",
        +    "private"
        +  ],
        +  "type": "string"
        +}
    • Addedget_slides
    • Changedimport_presentation1 field changed
      • addedInput schema / properties / access
        Added value: +{
        +  "description": "Who sees it (default \"private\": only you, until you publish it; \"public\": everybody reads it; \"open\": every signed-in person edits it too).",
        +  "enum": [
        +    "open",
        +    "public",
        +    "private"
        +  ],
        +  "type": "string"
        +}
    • Addedname_slides_after_titles
    • Changedupdate_presentation2 fields changed
      • addedInput schema / properties / names_from_titles
        Added value: +{
        +  "description": "Name every slide after its title (the text block with the biggest letters, the highest one of those), in every language it is written in. From then on a slide named after its title keeps following it.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / renamed
        Added value: +{
        +  "description": "Slides that got the name of their title.",
        +  "items": {
        +    "properties": {
        +      "name": {
        +        "type": "string"
        +      },
        +      "number": {
        +        "type": "integer"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  3. 18 tool updates
    • Changedadd_slide4 fields changed
      • addedOutput schema / properties / layout_warnings
        Added value: +{
        +  "description": "How the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "detail": {
        +        "type": "string"
        +      },
        +      "problem": {
        +        "description": "overflow, cut, outside or overlap.",
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Changedadd_slides4 fields changed
      • addedOutput schema / properties / slides / items / properties / layout_warnings
        Added value: +{
        +  "description": "How the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "detail": {
        +        "type": "string"
        +      },
        +      "problem": {
        +        "description": "overflow, cut, outside or overlap.",
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / slides / items / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / slides / items / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / slides / items / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Addedcheck_layout
    • Changedcreate_presentation7 fields changed
      • changedOutput schema / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / slides / items / properties / layout_warnings
        Added value: +{
        +  "description": "How the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "detail": {
        +        "type": "string"
        +      },
        +      "problem": {
        +        "description": "overflow, cut, outside or overlap.",
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / slides / items / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / slides / items / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / slides / items / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Changeddelete_slide1 field changed
      • addedInput schema / properties / base_version
        Added value: +{
        +  "description": "Optional: the \"version\" of the slide as you read it. The change is refused (409 conflict) when somebody changed the slide meanwhile, instead of overwriting their work.",
        +  "type": "string"
        +}
    • Changededit_blocks5 fields changed
      • addedInput schema / properties / base_version
        Added value: +{
        +  "description": "Optional: the \"version\" of the slide as you read it. The change is refused (409 conflict) when somebody changed the slide meanwhile, instead of overwriting their work.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / layout_warnings
        Added value: +{
        +  "description": "How the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "detail": {
        +        "type": "string"
        +      },
        +      "problem": {
        +        "description": "overflow, cut, outside or overlap.",
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Addededit_slides
    • Addedexport_presentation
    • Changedget_presentation11 fields changed
      • addedInput schema / properties / from_number
        Added value: +{
        +  "description": "Only the slides from this number on (1-based).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / slide_ids
        Added value: +{
        +  "description": "Only these slides (ids).",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / texts_only
        Added value: +{
        +  "description": "Only the texts of the blocks (for reading, checking or translating), not their props.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / to_number
        Added value: +{
        +  "description": "Only the slides up to this number (inclusive).",
        +  "type": "integer"
        +}
      • changedOutput schema / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / slides / items / properties / layout_warnings
        Added value: +{
        +  "description": "How the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "detail": {
        +        "type": "string"
        +      },
        +      "problem": {
        +        "description": "overflow, cut, outside or overlap.",
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / slides / items / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / slides / items / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / slides / items / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Changedget_project3 fields changed
      • changedOutput schema / properties / presentations / items / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / presentations / items / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / presentations / items / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Changedget_slide4 fields changed
      • addedOutput schema / properties / layout_warnings
        Added value: +{
        +  "description": "How the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "detail": {
        +        "type": "string"
        +      },
        +      "problem": {
        +        "description": "overflow, cut, outside or overlap.",
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Changedimport_presentation13 fields changed
      • addedInput schema / properties / base_version
        Added value: +{
        +  "description": "With \"into\": the \"version\" of the presentation as you read it; refused (409) when it changed meanwhile.",
        +  "type": "string"
        +}
      • addedInput schema / properties / into
        Added value: +{
        +  "description": "Slug of an existing presentation to update from the file (instead of creating a new one).",
        +  "type": "string"
        +}
      • addedInput schema / properties / remove_extra
        Added value: +{
        +  "description": "With \"into\": remove the slides of the presentation after the last slide of the file (default false).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / rename
        Added value: +{
        +  "description": "With \"into\": give the slides the names the file has (default false: they keep theirs).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / slides
        Added value: +{
        +  "description": "With \"into\": only these slide numbers of the file (1-based); all by default.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / slides / items / properties / layout_warnings
        Added value: +{
        +  "description": "How the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "detail": {
        +        "type": "string"
        +      },
        +      "problem": {
        +        "description": "overflow, cut, outside or overlap.",
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / slides / items / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / slides / items / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / slides / items / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / updated
        Added value: +{
        +  "properties": {
        +    "added": {
        +      "description": "Numbers of the slides it added.",
        +      "items": {
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    },
        +    "changed": {
        +      "description": "Numbers of the slides the file replaced.",
        +      "items": {
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    },
        +    "removed": {
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Changedlist_presentations3 fields changed
      • changedOutput schema / properties / presentations / items / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / presentations / items / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / presentations / items / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Addedpreview_slides
    • Changedread_presentation7 fields changed
      • addedInput schema / properties / from_number
        Added value: +{
        +  "description": "Only the slides from this number on (1-based).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / slide_ids
        Added value: +{
        +  "description": "Only these slides (ids).",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / to_number
        Added value: +{
        +  "description": "Only the slides up to this number (inclusive).",
        +  "type": "integer"
        +}
      • changedOutput schema / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / slides_total
        Added value: +{
        +  "description": "Slides of the whole presentation (a part may be shown).",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Addedreplace_text
    • Changedupdate_presentation3 fields changed
      • changedOutput schema / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
    • Changedupdate_slide5 fields changed
      • addedInput schema / properties / base_version
        Added value: +{
        +  "description": "Optional: the \"version\" of the slide as you read it. The change is refused (409 conflict) when somebody changed the slide meanwhile, instead of overwriting their work.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / layout_warnings
        Added value: +{
        +  "description": "How the changed slides will probably look: texts too long for their blocks, blocks outside the slide, texts over each other (estimated -- look at them).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "detail": {
        +        "type": "string"
        +      },
        +      "problem": {
        +        "description": "overflow, cut, outside or overlap.",
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / missing_translations / description
        Previous value: -"What is not translated yet into the other languages of the site (add it)."New value: +"What is not translated yet into the other languages of the site (add it): the first ones; \"missing_translations_count\" says how many there are."
      • addedOutput schema / properties / missing_translations_count
        Added value: +{
        +  "description": "How many texts are not translated yet.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "description": "Stamp of the content as it is now: give it back as \"base_version\" to change it only if nobody else did meanwhile.",
        +  "type": "string"
        +}
  4. 8 tool updates
    • Changedcreate_presentation3 fields changed
      • addedInput schema / properties / database / properties / clickhouse
        Added value: +{
        +  "description": "ClickHouse SQL (statements separated by \";\") that creates and fills the database.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / cover_slide
        Added value: +{
        +  "description": "Id of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / database / properties / clickhouse
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_presentation2 fields changed
      • addedOutput schema / properties / cover_slide
        Added value: +{
        +  "description": "Id of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / database / properties / clickhouse
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_project1 field changed
      • addedOutput schema / properties / presentations / items / properties / cover_slide
        Added value: +{
        +  "description": "Id of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedimport_presentation2 fields changed
      • addedOutput schema / properties / cover_slide
        Added value: +{
        +  "description": "Id of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / database / properties / clickhouse
        Added value: +{
        +  "type": "string"
        +}
    • Changedlist_presentations1 field changed
      • addedOutput schema / properties / presentations / items / properties / cover_slide
        Added value: +{
        +  "description": "Id of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedread_presentation1 field changed
      • addedOutput schema / properties / cover_slide
        Added value: +{
        +  "description": "Id of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedrun_code3 fields changed
      • changedInput schema / properties / lang / enum
        Previous value: -[
        -  "sql",
        -  "mongodb",
        -  "redis",
        -  "python",
        -  "bash"
        -]New value: +[
        +  "sql",
        +  "mongodb",
        +  "redis",
        +  "clickhouse",
        +  "python",
        +  "bash"
        +]
      • changedInput schema / properties / reset / description
        Previous value: -"sql, mongodb, redis: first make your database again from the script of the presentation."New value: +"sql, mongodb, redis, clickhouse: first make your database again from the script of the presentation."
      • changedOutput schema / description
        Previous value: -"sql / mongodb / redis: \"results\" (tables, counts or messages), \"notices\" and \"sql_error\"; python / bash: \"stdout\", \"stderr\", \"exit_code\" and \"timed_out\"."New value: +"sql / mongodb / redis / clickhouse: \"results\" (tables, counts or messages), \"notices\" and \"sql_error\"; python / bash: \"stdout\", \"stderr\", \"exit_code\" and \"timed_out\"."
    • Changedupdate_presentation4 fields changed
      • addedInput schema / properties / cover_slide
        Added value: +{
        +  "description": "Id of the slide shown as the cover of the presentation in the lists of presentations; null: the first slide, whichever it is (the default).",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / database / properties / clickhouse
        Added value: +{
        +  "description": "ClickHouse SQL (statements separated by \";\") that creates and fills the database.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / cover_slide
        Added value: +{
        +  "description": "Id of the slide shown as its cover in the lists (null: an uploaded picture, or no slides).",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / database / properties / clickhouse
        Added value: +{
        +  "type": "string"
        +}
  5. 8 tool updates
    • Changedadd_slide4 fields changed
      • addedInput schema / properties / transition
        Added value: +{
        +  "default": "none",
        +  "description": "Entrance effect of this incoming slide (default: none).",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / transition_duration
        Added value: +{
        +  "default": 500,
        +  "description": "Animation duration in milliseconds (100-3000, default 500); not auto advance. Values outside the range are clamped.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / transition
        Added value: +{
        +  "description": "Entrance effect of this incoming slide.",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / transition_duration
        Added value: +{
        +  "description": "Animation milliseconds, not auto advance.",
        +  "maximum": 3000,
        +  "minimum": 100,
        +  "type": "integer"
        +}
    • Changedadd_slides4 fields changed
      • changedInput schema / properties / slides / description
        Previous value: -"The slides: [{\"name\", \"w\", \"h\", \"bg\", \"fit\", \"background\", \"objects\"}]."New value: +"The slides: [{\"name\", \"w\", \"h\", \"bg\", \"fit\", \"transition\", \"transition_duration\", \"background\", \"objects\"}]."
      • addedInput schema / properties / slides / items / properties
        Added value: +{
        +  "background": {
        +    "description": "Background picture: the \"src\" of an uploaded picture; null removes it.",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "bg": {
        +    "description": "Background colour, #rrggbb.",
        +    "type": "string"
        +  },
        +  "fit": {
        +    "description": "How the background picture fits.",
        +    "enum": [
        +      "contain",
        +      "cover",
        +      "stretch"
        +    ],
        +    "type": "string"
        +  },
        +  "h": {
        +    "description": "Canvas height in px (default 720).",
        +    "type": "integer"
        +  },
        +  "name": {
        +    "description": "Slide name (at most 100 characters), in the language of the presentation.",
        +    "maxLength": 100,
        +    "type": "string"
        +  },
        +  "name_tr": {
        +    "additionalProperties": {
        +      "type": "string"
        +    },
        +    "description": "The slide name in the other languages of the site: {\"en\": \"...\"}.",
        +    "type": "object"
        +  },
        +  "objects": {
        +    "description": "Blocks of the slide, bottom to top: [{\"type\": \"text\"|\"shape\"|\"button\"|\"line\"|\"image\"|\"code\", \"props\": {...}}]. Missing props take the presentation theme's defaults (every prop is described in the block format reference). A link to a slide of the same presentation may be given as {\"kind\": \"slide\", \"slide_number\": N}.",
        +    "items": {
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "transition": {
        +    "default": "none",
        +    "description": "Entrance effect of this incoming slide (default: none).",
        +    "enum": [
        +      "none",
        +      "fade",
        +      "slide-left",
        +      "slide-right",
        +      "zoom"
        +    ],
        +    "type": "string"
        +  },
        +  "transition_duration": {
        +    "default": 500,
        +    "description": "Animation duration in milliseconds (100-3000, default 500); not auto advance. Values outside the range are clamped.",
        +    "type": "integer"
        +  },
        +  "w": {
        +    "description": "Canvas width in px (200-4000, default 1280).",
        +    "type": "integer"
        +  }
        +}
      • addedOutput schema / properties / slides / items / properties / transition
        Added value: +{
        +  "description": "Entrance effect of this incoming slide.",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / slides / items / properties / transition_duration
        Added value: +{
        +  "description": "Animation milliseconds, not auto advance.",
        +  "maximum": 3000,
        +  "minimum": 100,
        +  "type": "integer"
        +}
    • Changedcreate_presentation3 fields changed
      • addedInput schema / properties / slides / items / properties
        Added value: +{
        +  "background": {
        +    "description": "Background picture: the \"src\" of an uploaded picture; null removes it.",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "bg": {
        +    "description": "Background colour, #rrggbb.",
        +    "type": "string"
        +  },
        +  "fit": {
        +    "description": "How the background picture fits.",
        +    "enum": [
        +      "contain",
        +      "cover",
        +      "stretch"
        +    ],
        +    "type": "string"
        +  },
        +  "h": {
        +    "description": "Canvas height in px (default 720).",
        +    "type": "integer"
        +  },
        +  "name": {
        +    "description": "Slide name (at most 100 characters), in the language of the presentation.",
        +    "maxLength": 100,
        +    "type": "string"
        +  },
        +  "name_tr": {
        +    "additionalProperties": {
        +      "type": "string"
        +    },
        +    "description": "The slide name in the other languages of the site: {\"en\": \"...\"}.",
        +    "type": "object"
        +  },
        +  "objects": {
        +    "description": "Blocks of the slide, bottom to top: [{\"type\": \"text\"|\"shape\"|\"button\"|\"line\"|\"image\"|\"code\", \"props\": {...}}]. Missing props take the presentation theme's defaults (every prop is described in the block format reference). A link to a slide of the same presentation may be given as {\"kind\": \"slide\", \"slide_number\": N}.",
        +    "items": {
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "transition": {
        +    "default": "none",
        +    "description": "Entrance effect of this incoming slide (default: none).",
        +    "enum": [
        +      "none",
        +      "fade",
        +      "slide-left",
        +      "slide-right",
        +      "zoom"
        +    ],
        +    "type": "string"
        +  },
        +  "transition_duration": {
        +    "default": 500,
        +    "description": "Animation duration in milliseconds (100-3000, default 500); not auto advance. Values outside the range are clamped.",
        +    "type": "integer"
        +  },
        +  "w": {
        +    "description": "Canvas width in px (200-4000, default 1280).",
        +    "type": "integer"
        +  }
        +}
      • addedOutput schema / properties / slides / items / properties / transition
        Added value: +{
        +  "description": "Entrance effect of this incoming slide.",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / slides / items / properties / transition_duration
        Added value: +{
        +  "description": "Animation milliseconds, not auto advance.",
        +  "maximum": 3000,
        +  "minimum": 100,
        +  "type": "integer"
        +}
    • Changededit_blocks2 fields changed
      • addedOutput schema / properties / transition
        Added value: +{
        +  "description": "Entrance effect of this incoming slide.",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / transition_duration
        Added value: +{
        +  "description": "Animation milliseconds, not auto advance.",
        +  "maximum": 3000,
        +  "minimum": 100,
        +  "type": "integer"
        +}
    • Changedget_presentation2 fields changed
      • addedOutput schema / properties / slides / items / properties / transition
        Added value: +{
        +  "description": "Entrance effect of this incoming slide.",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / slides / items / properties / transition_duration
        Added value: +{
        +  "description": "Animation milliseconds, not auto advance.",
        +  "maximum": 3000,
        +  "minimum": 100,
        +  "type": "integer"
        +}
    • Changedget_slide2 fields changed
      • addedOutput schema / properties / transition
        Added value: +{
        +  "description": "Entrance effect of this incoming slide.",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / transition_duration
        Added value: +{
        +  "description": "Animation milliseconds, not auto advance.",
        +  "maximum": 3000,
        +  "minimum": 100,
        +  "type": "integer"
        +}
    • Changedimport_presentation2 fields changed
      • addedOutput schema / properties / slides / items / properties / transition
        Added value: +{
        +  "description": "Entrance effect of this incoming slide.",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / slides / items / properties / transition_duration
        Added value: +{
        +  "description": "Animation milliseconds, not auto advance.",
        +  "maximum": 3000,
        +  "minimum": 100,
        +  "type": "integer"
        +}
    • Changedupdate_slide4 fields changed
      • addedInput schema / properties / transition
        Added value: +{
        +  "default": "none",
        +  "description": "Entrance effect of this incoming slide (default: none).",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / transition_duration
        Added value: +{
        +  "default": 500,
        +  "description": "Animation duration in milliseconds (100-3000, default 500); not auto advance. Values outside the range are clamped.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / transition
        Added value: +{
        +  "description": "Entrance effect of this incoming slide.",
        +  "enum": [
        +    "none",
        +    "fade",
        +    "slide-left",
        +    "slide-right",
        +    "zoom"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / transition_duration
        Added value: +{
        +  "description": "Animation milliseconds, not auto advance.",
        +  "maximum": 3000,
        +  "minimum": 100,
        +  "type": "integer"
        +}
  6. 1 tool update
    • Changedget_format1 field changed
      • addedOutput schema / properties / borders
        Added value: +{
        +  "type": "object"
        +}
  7. 22 tool updates
    • Changedadd_slide4 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Slide name (at most 100 characters)."New value: +"Slide name (at most 100 characters), in the language of the presentation."
      • addedInput schema / properties / name_tr
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "The slide name in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / name_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedadd_slides2 fields changed
      • addedOutput schema / properties / slides / items / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / slides / items / properties / name_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedanswer_access_request3 fields changed
      • changedOutput schema / properties / presentation / description
        Previous value: -"Slug of the presentation."New value: +"Slug of the presentation (null: a project)."
      • changedOutput schema / properties / presentation / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / project
        Added value: +{
        +  "description": "Slug of the project, for access to all of it.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedcreate_presentation8 fields changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "description": "The language \"title\", slide names and blocks' \"html\" are written in (default: Russian when they have Cyrillic letters, otherwise English).",
        +  "enum": [
        +    "ru",
        +    "en"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / title_tr
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "The title in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / lang
        Added value: +{
        +  "description": "The language its texts are written in; \"tr\" holds the others.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / languages
        Added value: +{
        +  "description": "The languages of the site.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / slides / items / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / slides / items / properties / name_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / title_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedcreate_project2 fields changed
      • addedOutput schema / properties / access
        Added value: +{
        +  "description": "open, public or private: inherited by its presentations.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / grants
        Added value: +{
        +  "description": "Who was given access (the owner sees it).",
        +  "items": {
        +    "properties": {
        +      "role": {
        +        "type": "string"
        +      },
        +      "since": {
        +        "description": "ISO 8601 date and time.",
        +        "type": "string"
        +      },
        +      "user": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changededit_blocks2 fields changed
      • addedOutput schema / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / name_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedget_access6 fields changed
      • addedOutput schema / properties / effective_level
        Added value: +{
        +  "description": "The level that counts (the project's one when stricter).",
        +  "type": "string"
        +}
      • changedOutput schema / properties / level / description
        Previous value: -"open, public or private."New value: +"open, public or private: the presentation's own level."
      • changedOutput schema / properties / pending_requests / items / properties / presentation / description
        Previous value: -"Slug of the presentation."New value: +"Slug of the presentation (null: a project)."
      • changedOutput schema / properties / pending_requests / items / properties / presentation / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / pending_requests / items / properties / project
        Added value: +{
        +  "description": "Slug of the project, for access to all of it.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / project_level
        Added value: +{
        +  "description": "The level of its project, if any.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedget_format1 field changed
      • addedOutput schema / properties / languages
        Added value: +{
        +  "type": "object"
        +}
    • Changedget_presentation6 fields changed
      • addedOutput schema / properties / lang
        Added value: +{
        +  "description": "The language its texts are written in; \"tr\" holds the others.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / languages
        Added value: +{
        +  "description": "The languages of the site.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / slides / items / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / slides / items / properties / name_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / title_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedget_project6 fields changed
      • addedOutput schema / properties / access
        Added value: +{
        +  "description": "open, public or private: inherited by its presentations.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / grants
        Added value: +{
        +  "description": "Who was given access (the owner sees it).",
        +  "items": {
        +    "properties": {
        +      "role": {
        +        "type": "string"
        +      },
        +      "since": {
        +        "description": "ISO 8601 date and time.",
        +        "type": "string"
        +      },
        +      "user": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / presentations / items / properties / lang
        Added value: +{
        +  "description": "The language its texts are written in; \"tr\" holds the others.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / presentations / items / properties / languages
        Added value: +{
        +  "description": "The languages of the site.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / presentations / items / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / presentations / items / properties / title_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedget_slide2 fields changed
      • addedOutput schema / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / name_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedimport_presentation6 fields changed
      • addedOutput schema / properties / lang
        Added value: +{
        +  "description": "The language its texts are written in; \"tr\" holds the others.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / languages
        Added value: +{
        +  "description": "The languages of the site.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / slides / items / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / slides / items / properties / name_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / title_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedlist_access_requests3 fields changed
      • changedOutput schema / properties / requests / items / properties / presentation / description
        Previous value: -"Slug of the presentation."New value: +"Slug of the presentation (null: a project)."
      • changedOutput schema / properties / requests / items / properties / presentation / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / requests / items / properties / project
        Added value: +{
        +  "description": "Slug of the project, for access to all of it.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedlist_presentations4 fields changed
      • addedOutput schema / properties / presentations / items / properties / lang
        Added value: +{
        +  "description": "The language its texts are written in; \"tr\" holds the others.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / presentations / items / properties / languages
        Added value: +{
        +  "description": "The languages of the site.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / presentations / items / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / presentations / items / properties / title_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedlist_projects2 fields changed
      • addedOutput schema / properties / projects / items / properties / access
        Added value: +{
        +  "description": "open, public or private: inherited by its presentations.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / projects / items / properties / grants
        Added value: +{
        +  "description": "Who was given access (the owner sees it).",
        +  "items": {
        +    "properties": {
        +      "role": {
        +        "type": "string"
        +      },
        +      "since": {
        +        "description": "ISO 8601 date and time.",
        +        "type": "string"
        +      },
        +      "user": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedread_presentation6 fields changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "description": "Read the texts in this language (default: the one it is written in); what is not translated shows in its own language.",
        +  "enum": [
        +    "ru",
        +    "en"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / lang
        Added value: +{
        +  "description": "The language its texts are written in; \"tr\" holds the others.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / languages
        Added value: +{
        +  "description": "The languages of the site.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / shown_lang
        Added value: +{
        +  "description": "The language of the texts shown.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / title_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedrequest_access3 fields changed
      • changedOutput schema / properties / presentation / description
        Previous value: -"Slug of the presentation."New value: +"Slug of the presentation (null: a project)."
      • changedOutput schema / properties / presentation / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / project
        Added value: +{
        +  "description": "Slug of the project, for access to all of it.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Addedrequest_project_access
    • Changedset_access6 fields changed
      • addedOutput schema / properties / effective_level
        Added value: +{
        +  "description": "The level that counts (the project's one when stricter).",
        +  "type": "string"
        +}
      • changedOutput schema / properties / level / description
        Previous value: -"open, public or private."New value: +"open, public or private: the presentation's own level."
      • changedOutput schema / properties / pending_requests / items / properties / presentation / description
        Previous value: -"Slug of the presentation."New value: +"Slug of the presentation (null: a project)."
      • changedOutput schema / properties / pending_requests / items / properties / presentation / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / pending_requests / items / properties / project
        Added value: +{
        +  "description": "Slug of the project, for access to all of it.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / project_level
        Added value: +{
        +  "description": "The level of its project, if any.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedupdate_presentation5 fields changed
      • addedInput schema / properties / title_tr
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "The title in the other languages of the site: {\"en\": \"...\"} (the languages left out keep theirs).",
        +  "type": "object"
        +}
      • addedOutput schema / properties / lang
        Added value: +{
        +  "description": "The language its texts are written in; \"tr\" holds the others.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / languages
        Added value: +{
        +  "description": "The languages of the site.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / title_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
    • Changedupdate_project5 fields changed
      • addedInput schema / properties / access
        Added value: +{
        +  "description": "Level of the project: \"open\", \"public\" or \"private\".",
        +  "enum": [
        +    "open",
        +    "public",
        +    "private"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / grant
        Added value: +{
        +  "description": "Give access to the whole project: [{\"user\": <user name>, \"role\": \"view\"|\"edit\"}].",
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / revoke
        Added value: +{
        +  "description": "User names whose access is taken away.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / access
        Added value: +{
        +  "description": "open, public or private: inherited by its presentations.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / grants
        Added value: +{
        +  "description": "Who was given access (the owner sees it).",
        +  "items": {
        +    "properties": {
        +      "role": {
        +        "type": "string"
        +      },
        +      "since": {
        +        "description": "ISO 8601 date and time.",
        +        "type": "string"
        +      },
        +      "user": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedupdate_slide4 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Slide name (at most 100 characters)."New value: +"Slide name (at most 100 characters), in the language of the presentation."
      • addedInput schema / properties / name_tr
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "The slide name in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / missing_translations
        Added value: +{
        +  "description": "What is not translated yet into the other languages of the site (add it).",
        +  "items": {
        +    "properties": {
        +      "block_id": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": "string"
        +      },
        +      "slide_id": {
        +        "type": "integer"
        +      },
        +      "slide_number": {
        +        "type": "integer"
        +      },
        +      "what": {
        +        "description": "title, slide name or block.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / name_tr
        Added value: +{
        +  "description": "The same text in the other languages of the site: {\"en\": \"...\"}.",
        +  "type": "object"
        +}
  8. 12 tool updates
    • Changedanswer_access_request1 field changed
      • addedInput schema / properties / whole_project
        Added value: +{
        +  "description": "Give the access for the whole project the presentation is in (default false: this presentation only).",
        +  "type": "boolean"
        +}
    • Changedcreate_presentation2 fields changed
      • addedInput schema / properties / project
        Added value: +{
        +  "description": "Slug of one of your projects to create the presentation in (at its end); its blocks may then lead to the slides of the other presentations of that project.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / project
        Added value: +{
        +  "description": "The project it belongs to, or null.",
        +  "properties": {
        +    "slug": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Addedcreate_project
    • Addeddelete_project
    • Changedget_presentation1 field changed
      • addedOutput schema / properties / project
        Added value: +{
        +  "description": "The project it belongs to, or null.",
        +  "properties": {
        +    "slug": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Addedget_project
    • Changedimport_presentation2 fields changed
      • addedInput schema / properties / project
        Added value: +{
        +  "description": "Slug of one of your projects to put the presentation in.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / project
        Added value: +{
        +  "description": "The project it belongs to, or null.",
        +  "properties": {
        +    "slug": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Changedlist_presentations2 fields changed
      • addedInput schema / properties / project
        Added value: +{
        +  "description": "Only the presentations of this project (its slug), in its order; \"scope\" is then ignored.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / presentations / items / properties / project
        Added value: +{
        +  "description": "The project it belongs to, or null.",
        +  "properties": {
        +    "slug": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Addedlist_projects
    • Changedread_presentation1 field changed
      • addedOutput schema / properties / project
        Added value: +{
        +  "description": "The project it belongs to, or null.",
        +  "properties": {
        +    "slug": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Changedupdate_presentation1 field changed
      • addedOutput schema / properties / project
        Added value: +{
        +  "description": "The project it belongs to, or null.",
        +  "properties": {
        +    "slug": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Addedupdate_project
  9. 10 tool updates
    • Changedadd_comment1 field changed
      • addedInput schema / properties / text / maxLength
        Added value: +4000
    • Changedadd_slide6 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Slide name (at most 30 characters)."New value: +"Slide name (at most 100 characters)."
      • addedInput schema / properties / name / maxLength
        Added value: +100
      • addedInput schema / properties / response
        Added value: +{
        +  "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / description
        Added value: +"A slide; the brief form (the default of the tools that change slides) has only id, number, name, url and the id and type of every block."
      • changedOutput schema / properties / objects / description
        Previous value: -"Blocks, bottom to top."New value: +"Blocks, bottom to top (\"props\" only in the full form)."
      • changedOutput schema / properties / objects / items / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "props"
        -]New value: +[
        +  "id",
        +  "type"
        +]
    • Addedadd_slides
    • Changedcreate_presentation5 fields changed
      • addedInput schema / properties / response
        Added value: +{
        +  "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / title / maxLength
        Added value: +100
      • addedOutput schema / properties / slides / items / description
        Added value: +"A slide; the brief form (the default of the tools that change slides) has only id, number, name, url and the id and type of every block."
      • changedOutput schema / properties / slides / items / properties / objects / description
        Previous value: -"Blocks, bottom to top."New value: +"Blocks, bottom to top (\"props\" only in the full form)."
      • changedOutput schema / properties / slides / items / properties / objects / items / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "props"
        -]New value: +[
        +  "id",
        +  "type"
        +]
    • Changededit_blocks4 fields changed
      • addedInput schema / properties / response
        Added value: +{
        +  "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / description
        Added value: +"A slide; the brief form (the default of the tools that change slides) has only id, number, name, url and the id and type of every block."
      • changedOutput schema / properties / objects / description
        Previous value: -"Blocks, bottom to top."New value: +"Blocks, bottom to top (\"props\" only in the full form)."
      • changedOutput schema / properties / objects / items / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "props"
        -]New value: +[
        +  "id",
        +  "type"
        +]
    • Changedget_presentation3 fields changed
      • addedOutput schema / properties / slides / items / description
        Added value: +"A slide; the brief form (the default of the tools that change slides) has only id, number, name, url and the id and type of every block."
      • changedOutput schema / properties / slides / items / properties / objects / description
        Previous value: -"Blocks, bottom to top."New value: +"Blocks, bottom to top (\"props\" only in the full form)."
      • changedOutput schema / properties / slides / items / properties / objects / items / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "props"
        -]New value: +[
        +  "id",
        +  "type"
        +]
    • Changedget_slide3 fields changed
      • addedOutput schema / description
        Added value: +"A slide; the brief form (the default of the tools that change slides) has only id, number, name, url and the id and type of every block."
      • changedOutput schema / properties / objects / description
        Previous value: -"Blocks, bottom to top."New value: +"Blocks, bottom to top (\"props\" only in the full form)."
      • changedOutput schema / properties / objects / items / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "props"
        -]New value: +[
        +  "id",
        +  "type"
        +]
    • Addedimport_presentation
    • Changedupdate_presentation1 field changed
      • addedInput schema / properties / title / maxLength
        Added value: +100
    • Changedupdate_slide6 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Slide name (at most 30 characters)."New value: +"Slide name (at most 100 characters)."
      • addedInput schema / properties / name / maxLength
        Added value: +100
      • addedInput schema / properties / response
        Added value: +{
        +  "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / description
        Added value: +"A slide; the brief form (the default of the tools that change slides) has only id, number, name, url and the id and type of every block."
      • changedOutput schema / properties / objects / description
        Previous value: -"Blocks, bottom to top."New value: +"Blocks, bottom to top (\"props\" only in the full form)."
      • changedOutput schema / properties / objects / items / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "props"
        -]New value: +[
        +  "id",
        +  "type"
        +]
  10. 4 tool updates
    • Changedcreate_presentation2 fields changed
      • addedInput schema / properties / database
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Setup scripts of the databases the runnable code blocks work in, by language. Every viewer runs the blocks in a private database made from the script (up to 50000 characters each; an empty string removes a script).",
        +  "properties": {
        +    "mongodb": {
        +      "description": "MongoDB shell (mongosh JavaScript) that creates and fills the database.",
        +      "type": "string"
        +    },
        +    "redis": {
        +      "description": "Redis commands that creates and fills the database.",
        +      "type": "string"
        +    },
        +    "sql": {
        +      "description": "PostgreSQL SQL that creates and fills the database.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / database
        Added value: +{
        +  "description": "Setup scripts of the databases of runnable code blocks (shown to the author only).",
        +  "properties": {
        +    "mongodb": {
        +      "type": "string"
        +    },
        +    "redis": {
        +      "type": "string"
        +    },
        +    "sql": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_presentation1 field changed
      • addedOutput schema / properties / database
        Added value: +{
        +  "description": "Setup scripts of the databases of runnable code blocks (shown to the author only).",
        +  "properties": {
        +    "mongodb": {
        +      "type": "string"
        +    },
        +    "redis": {
        +      "type": "string"
        +    },
        +    "sql": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedrun_code
    • Changedupdate_presentation2 fields changed
      • addedInput schema / properties / database
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Setup scripts of the databases the runnable code blocks work in, by language. Every viewer runs the blocks in a private database made from the script (up to 50000 characters each; an empty string removes a script). Only the author may change them; the languages left out keep their scripts.",
        +  "properties": {
        +    "mongodb": {
        +      "description": "MongoDB shell (mongosh JavaScript) that creates and fills the database.",
        +      "type": "string"
        +    },
        +    "redis": {
        +      "description": "Redis commands that creates and fills the database.",
        +      "type": "string"
        +    },
        +    "sql": {
        +      "description": "PostgreSQL SQL that creates and fills the database.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / database
        Added value: +{
        +  "description": "Setup scripts of the databases of runnable code blocks (shown to the author only).",
        +  "properties": {
        +    "mongodb": {
        +      "type": "string"
        +    },
        +    "redis": {
        +      "type": "string"
        +    },
        +    "sql": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
  11. 27 tool updates
    • Changedadd_comment1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "agent": {
        +      "description": "Name of the AI agent that wrote it, if any.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "author": {
        +      "type": "string"
        +    },
        +    "created_at": {
        +      "description": "ISO 8601 date and time.",
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "integer"
        +    },
        +    "resolved": {
        +      "type": "boolean"
        +    },
        +    "slide_id": {
        +      "description": "null: a note on the whole presentation.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "slide_number": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "text"
        +  ],
        +  "type": "object"
        +}
    • Changedadd_slide1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "background": {
        +      "description": "The \"src\" of the background picture, or null.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "bg": {
        +      "type": "string"
        +    },
        +    "fit": {
        +      "type": "string"
        +    },
        +    "h": {
        +      "type": "integer"
        +    },
        +    "id": {
        +      "description": "Stable id of the slide.",
        +      "type": "integer"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "number": {
        +      "description": "1-based position; changes when slides are reordered.",
        +      "type": "integer"
        +    },
        +    "objects": {
        +      "description": "Blocks, bottom to top.",
        +      "items": {
        +        "properties": {
        +          "id": {
        +            "type": "integer"
        +          },
        +          "props": {
        +            "description": "Every prop of the block (see the block format reference).",
        +            "type": "object"
        +          },
        +          "type": {
        +            "description": "text, shape, button, line, image or code.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "type",
        +          "props"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "url": {
        +      "description": "The address people open in a browser.",
        +      "type": "string"
        +    },
        +    "w": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "number",
        +    "objects"
        +  ],
        +  "type": "object"
        +}
    • Changedanswer_access_request2 fields changed
      • addedInput schema / properties / approve / description
        Added value: +"true approves the request, false declines it."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "agent": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "created_at": {
        +      "description": "ISO 8601 date and time.",
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "integer"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "presentation": {
        +      "description": "Slug of the presentation.",
        +      "type": "string"
        +    },
        +    "role": {
        +      "description": "view or edit.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "pending, approved or declined.",
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "user": {
        +      "description": "Who asks.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_presentation2 fields changed
      • addedInput schema / properties / description / description
        Added value: +"Description shown on the presentation page (optional)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "access": {
        +      "description": "open, public or private.",
        +      "type": "string"
        +    },
        +    "can_edit": {
        +      "description": "Whether you may change it.",
        +      "type": "boolean"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "integer"
        +    },
        +    "owner": {
        +      "description": "User name of the author.",
        +      "type": "string"
        +    },
        +    "slides": {
        +      "items": {
        +        "properties": {
        +          "background": {
        +            "description": "The \"src\" of the background picture, or null.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "bg": {
        +            "type": "string"
        +          },
        +          "fit": {
        +            "type": "string"
        +          },
        +          "h": {
        +            "type": "integer"
        +          },
        +          "id": {
        +            "description": "Stable id of the slide.",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "number": {
        +            "description": "1-based position; changes when slides are reordered.",
        +            "type": "integer"
        +          },
        +          "objects": {
        +            "description": "Blocks, bottom to top.",
        +            "items": {
        +              "properties": {
        +                "id": {
        +                  "type": "integer"
        +                },
        +                "props": {
        +                  "description": "Every prop of the block (see the block format reference).",
        +                  "type": "object"
        +                },
        +                "type": {
        +                  "description": "text, shape, button, line, image or code.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "type",
        +                "props"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "url": {
        +            "description": "The address people open in a browser.",
        +            "type": "string"
        +          },
        +          "w": {
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "number",
        +          "objects"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "The address of the presentation: /movie/<slug>/.",
        +      "type": "string"
        +    },
        +    "theme": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "description": "The address people open in a browser.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "slug",
        +    "title",
        +    "slides"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_comment1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "deleted": {
        +      "description": "Id of the deleted note.",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "deleted"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_presentation1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "deleted": {
        +      "description": "Slug of the deleted presentation.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "deleted"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_slide1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "deleted": {
        +      "description": "Id of the deleted slide.",
        +      "type": "integer"
        +    },
        +    "slides": {
        +      "description": "Slides left.",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "deleted"
        +  ],
        +  "type": "object"
        +}
    • Changededit_blocks1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "background": {
        +      "description": "The \"src\" of the background picture, or null.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "bg": {
        +      "type": "string"
        +    },
        +    "fit": {
        +      "type": "string"
        +    },
        +    "h": {
        +      "type": "integer"
        +    },
        +    "id": {
        +      "description": "Stable id of the slide.",
        +      "type": "integer"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "number": {
        +      "description": "1-based position; changes when slides are reordered.",
        +      "type": "integer"
        +    },
        +    "objects": {
        +      "description": "Blocks, bottom to top.",
        +      "items": {
        +        "properties": {
        +          "id": {
        +            "type": "integer"
        +          },
        +          "props": {
        +            "description": "Every prop of the block (see the block format reference).",
        +            "type": "object"
        +          },
        +          "type": {
        +            "description": "text, shape, button, line, image or code.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "type",
        +          "props"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "url": {
        +      "description": "The address people open in a browser.",
        +      "type": "string"
        +    },
        +    "w": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "number",
        +    "objects"
        +  ],
        +  "type": "object"
        +}
    • Changedget_access1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "grants": {
        +      "items": {
        +        "properties": {
        +          "role": {
        +            "type": "string"
        +          },
        +          "since": {
        +            "description": "ISO 8601 date and time.",
        +            "type": "string"
        +          },
        +          "user": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "level": {
        +      "description": "open, public or private.",
        +      "type": "string"
        +    },
        +    "pending_requests": {
        +      "items": {
        +        "properties": {
        +          "agent": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 date and time.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "integer"
        +          },
        +          "message": {
        +            "type": "string"
        +          },
        +          "presentation": {
        +            "description": "Slug of the presentation.",
        +            "type": "string"
        +          },
        +          "role": {
        +            "description": "view or edit.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "pending, approved or declined.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "user": {
        +            "description": "Who asks.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "level"
        +  ],
        +  "type": "object"
        +}
    • Changedget_format1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "booleans": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "canvas": {
        +      "type": "object"
        +    },
        +    "colors": {
        +      "type": "object"
        +    },
        +    "enums": {
        +      "type": "object"
        +    },
        +    "html": {
        +      "type": "string"
        +    },
        +    "links": {
        +      "type": "object"
        +    },
        +    "numbers": {
        +      "type": "object"
        +    },
        +    "types": {
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "types"
        +  ],
        +  "type": "object"
        +}
    • Changedget_presentation1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "access": {
        +      "description": "open, public or private.",
        +      "type": "string"
        +    },
        +    "can_edit": {
        +      "description": "Whether you may change it.",
        +      "type": "boolean"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "integer"
        +    },
        +    "owner": {
        +      "description": "User name of the author.",
        +      "type": "string"
        +    },
        +    "slides": {
        +      "items": {
        +        "properties": {
        +          "background": {
        +            "description": "The \"src\" of the background picture, or null.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "bg": {
        +            "type": "string"
        +          },
        +          "fit": {
        +            "type": "string"
        +          },
        +          "h": {
        +            "type": "integer"
        +          },
        +          "id": {
        +            "description": "Stable id of the slide.",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "number": {
        +            "description": "1-based position; changes when slides are reordered.",
        +            "type": "integer"
        +          },
        +          "objects": {
        +            "description": "Blocks, bottom to top.",
        +            "items": {
        +              "properties": {
        +                "id": {
        +                  "type": "integer"
        +                },
        +                "props": {
        +                  "description": "Every prop of the block (see the block format reference).",
        +                  "type": "object"
        +                },
        +                "type": {
        +                  "description": "text, shape, button, line, image or code.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "type",
        +                "props"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "url": {
        +            "description": "The address people open in a browser.",
        +            "type": "string"
        +          },
        +          "w": {
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "number",
        +          "objects"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "The address of the presentation: /movie/<slug>/.",
        +      "type": "string"
        +    },
        +    "theme": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "description": "The address people open in a browser.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "slug",
        +    "title",
        +    "slides"
        +  ],
        +  "type": "object"
        +}
    • Changedget_slide1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "background": {
        +      "description": "The \"src\" of the background picture, or null.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "bg": {
        +      "type": "string"
        +    },
        +    "fit": {
        +      "type": "string"
        +    },
        +    "h": {
        +      "type": "integer"
        +    },
        +    "id": {
        +      "description": "Stable id of the slide.",
        +      "type": "integer"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "number": {
        +      "description": "1-based position; changes when slides are reordered.",
        +      "type": "integer"
        +    },
        +    "objects": {
        +      "description": "Blocks, bottom to top.",
        +      "items": {
        +        "properties": {
        +          "id": {
        +            "type": "integer"
        +          },
        +          "props": {
        +            "description": "Every prop of the block (see the block format reference).",
        +            "type": "object"
        +          },
        +          "type": {
        +            "description": "text, shape, button, line, image or code.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "type",
        +          "props"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "url": {
        +      "description": "The address people open in a browser.",
        +      "type": "string"
        +    },
        +    "w": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "number",
        +    "objects"
        +  ],
        +  "type": "object"
        +}
    • Changedget_version2 fields changed
      • addedInput schema / properties / format / description
        Added value: +"Result format: \"markdown\" (default) or \"json\" (the complete content)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "description": "The version, with \"markdown\" (default) or \"content\" (format \"json\").",
        +  "properties": {
        +    "agent": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "author": {
        +      "type": "string"
        +    },
        +    "changes": {
        +      "description": "What changed in this version.",
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "content": {
        +      "type": "object"
        +    },
        +    "created_at": {
        +      "description": "ISO 8601 date and time.",
        +      "type": "string"
        +    },
        +    "markdown": {
        +      "type": "string"
        +    },
        +    "number": {
        +      "type": "integer"
        +    },
        +    "updated_at": {
        +      "description": "ISO 8601 date and time.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "number"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_access_requests3 fields changed
      • addedInput schema / properties / direction / description
        Added value: +"\"incoming\" (default): requests to you; \"outgoing\": requests you sent."
      • addedInput schema / properties / include_decided / description
        Added value: +"Also return approved and declined requests."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "requests": {
        +      "items": {
        +        "properties": {
        +          "agent": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 date and time.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "integer"
        +          },
        +          "message": {
        +            "type": "string"
        +          },
        +          "presentation": {
        +            "description": "Slug of the presentation.",
        +            "type": "string"
        +          },
        +          "role": {
        +            "description": "view or edit.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "pending, approved or declined.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "user": {
        +            "description": "Who asks.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "requests"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_comments2 fields changed
      • addedInput schema / properties / include_resolved / description
        Added value: +"Also return resolved threads (default: only open ones)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "comments": {
        +      "items": {
        +        "properties": {
        +          "agent": {
        +            "description": "Name of the AI agent that wrote it, if any.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "author": {
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 date and time.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "integer"
        +          },
        +          "replies": {
        +            "items": {
        +              "properties": {
        +                "agent": {
        +                  "description": "Name of the AI agent that wrote it, if any.",
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "author": {
        +                  "type": "string"
        +                },
        +                "created_at": {
        +                  "description": "ISO 8601 date and time.",
        +                  "type": "string"
        +                },
        +                "id": {
        +                  "type": "integer"
        +                },
        +                "resolved": {
        +                  "type": "boolean"
        +                },
        +                "slide_id": {
        +                  "description": "null: a note on the whole presentation.",
        +                  "type": [
        +                    "integer",
        +                    "null"
        +                  ]
        +                },
        +                "slide_number": {
        +                  "type": [
        +                    "integer",
        +                    "null"
        +                  ]
        +                },
        +                "text": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "text"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "resolved": {
        +            "type": "boolean"
        +          },
        +          "slide_id": {
        +            "description": "null: a note on the whole presentation.",
        +            "type": [
        +              "integer",
        +              "null"
        +            ]
        +          },
        +          "slide_number": {
        +            "type": [
        +              "integer",
        +              "null"
        +            ]
        +          },
        +          "text": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "text"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "comments"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_history1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "versions": {
        +      "items": {
        +        "properties": {
        +          "agent": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "author": {
        +            "type": "string"
        +          },
        +          "changes": {
        +            "description": "What changed in this version.",
        +            "items": {
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 date and time.",
        +            "type": "string"
        +          },
        +          "number": {
        +            "type": "integer"
        +          },
        +          "updated_at": {
        +            "description": "ISO 8601 date and time.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "number"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "versions"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_presentations2 fields changed
      • addedInput schema / properties / scope / description
        Added value: +"Which presentations: \"mine\" (default), \"shared\" with you, or \"open\" ones of anybody."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "presentations": {
        +      "items": {
        +        "properties": {
        +          "access": {
        +            "description": "open, public or private.",
        +            "type": "string"
        +          },
        +          "can_edit": {
        +            "description": "Whether you may change it.",
        +            "type": "boolean"
        +          },
        +          "description": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "integer"
        +          },
        +          "owner": {
        +            "description": "User name of the author.",
        +            "type": "string"
        +          },
        +          "slides": {
        +            "description": "Number of slides.",
        +            "type": "integer"
        +          },
        +          "slug": {
        +            "description": "The address of the presentation: /movie/<slug>/.",
        +            "type": "string"
        +          },
        +          "theme": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The address people open in a browser.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "slug",
        +          "title"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "presentations"
        +  ],
        +  "type": "object"
        +}
    • Changedread_presentation2 fields changed
      • addedInput schema / properties / format / description
        Added value: +"Result format: \"markdown\" (default, compact) or \"json\" (structured)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "description": "With format \"markdown\" (default): {\"markdown\"}; with \"json\": the presentation slide by slide.",
        +  "properties": {
        +    "access": {
        +      "description": "open, public or private.",
        +      "type": "string"
        +    },
        +    "can_edit": {
        +      "description": "Whether you may change it.",
        +      "type": "boolean"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "integer"
        +    },
        +    "markdown": {
        +      "type": "string"
        +    },
        +    "owner": {
        +      "description": "User name of the author.",
        +      "type": "string"
        +    },
        +    "slides": {
        +      "items": {
        +        "properties": {
        +          "blocks": {
        +            "description": "Texts, pictures, code and links in reading order.",
        +            "items": {
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "has_background_picture": {
        +            "type": "boolean"
        +          },
        +          "id": {
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "number": {
        +            "type": "integer"
        +          },
        +          "url": {
        +            "description": "The address people open in a browser.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "The address of the presentation: /movie/<slug>/.",
        +      "type": "string"
        +    },
        +    "theme": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "description": "The address people open in a browser.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedreorder_slides1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "order": {
        +      "items": {
        +        "properties": {
        +          "id": {
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "number": {
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "order"
        +  ],
        +  "type": "object"
        +}
    • Changedrequest_access1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "agent": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "created_at": {
        +      "description": "ISO 8601 date and time.",
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "integer"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "presentation": {
        +      "description": "Slug of the presentation.",
        +      "type": "string"
        +    },
        +    "role": {
        +      "description": "view or edit.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "pending, approved or declined.",
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "user": {
        +      "description": "Who asks.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedresolve_comment1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "id": {
        +      "type": "integer"
        +    },
        +    "resolved": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "resolved"
        +  ],
        +  "type": "object"
        +}
    • Changedrestore_version1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "restored": {
        +      "description": "The version that was brought back.",
        +      "type": "integer"
        +    },
        +    "version": {
        +      "properties": {
        +        "agent": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "author": {
        +          "type": "string"
        +        },
        +        "changes": {
        +          "description": "What changed in this version.",
        +          "items": {
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "created_at": {
        +          "description": "ISO 8601 date and time.",
        +          "type": "string"
        +        },
        +        "number": {
        +          "type": "integer"
        +        },
        +        "updated_at": {
        +          "description": "ISO 8601 date and time.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "number"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "restored"
        +  ],
        +  "type": "object"
        +}
    • Changedset_access3 fields changed
      • addedInput schema / properties / level / description
        Added value: +"New access level: \"open\", \"public\" or \"private\"."
      • addedInput schema / properties / revoke / description
        Added value: +"User names whose access is taken away."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "grants": {
        +      "items": {
        +        "properties": {
        +          "role": {
        +            "type": "string"
        +          },
        +          "since": {
        +            "description": "ISO 8601 date and time.",
        +            "type": "string"
        +          },
        +          "user": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "level": {
        +      "description": "open, public or private.",
        +      "type": "string"
        +    },
        +    "pending_requests": {
        +      "items": {
        +        "properties": {
        +          "agent": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 date and time.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "integer"
        +          },
        +          "message": {
        +            "type": "string"
        +          },
        +          "presentation": {
        +            "description": "Slug of the presentation.",
        +            "type": "string"
        +          },
        +          "role": {
        +            "description": "view or edit.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "pending, approved or declined.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "user": {
        +            "description": "Who asks.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "level"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_presentation4 fields changed
      • addedInput schema / properties / description / description
        Added value: +"New description; an empty string removes it."
      • addedInput schema / properties / theme / description
        Added value: +"Colour theme: the defaults of new slides and blocks."
      • addedInput schema / properties / title / description
        Added value: +"New title (at most 100 characters)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "access": {
        +      "description": "open, public or private.",
        +      "type": "string"
        +    },
        +    "can_edit": {
        +      "description": "Whether you may change it.",
        +      "type": "boolean"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "integer"
        +    },
        +    "owner": {
        +      "description": "User name of the author.",
        +      "type": "string"
        +    },
        +    "slides": {
        +      "description": "Number of slides.",
        +      "type": "integer"
        +    },
        +    "slug": {
        +      "description": "The address of the presentation: /movie/<slug>/.",
        +      "type": "string"
        +    },
        +    "theme": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "description": "The address people open in a browser.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "slug",
        +    "title"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_slide1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "background": {
        +      "description": "The \"src\" of the background picture, or null.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "bg": {
        +      "type": "string"
        +    },
        +    "fit": {
        +      "type": "string"
        +    },
        +    "h": {
        +      "type": "integer"
        +    },
        +    "id": {
        +      "description": "Stable id of the slide.",
        +      "type": "integer"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "number": {
        +      "description": "1-based position; changes when slides are reordered.",
        +      "type": "integer"
        +    },
        +    "objects": {
        +      "description": "Blocks, bottom to top.",
        +      "items": {
        +        "properties": {
        +          "id": {
        +            "type": "integer"
        +          },
        +          "props": {
        +            "description": "Every prop of the block (see the block format reference).",
        +            "type": "object"
        +          },
        +          "type": {
        +            "description": "text, shape, button, line, image or code.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "type",
        +          "props"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "url": {
        +      "description": "The address people open in a browser.",
        +      "type": "string"
        +    },
        +    "w": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "number",
        +    "objects"
        +  ],
        +  "type": "object"
        +}
    • Changedupload_image1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "h": {
        +      "type": "integer"
        +    },
        +    "src": {
        +      "description": "Use it as \"src\" of an image block or background.",
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    },
        +    "w": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "src"
        +  ],
        +  "type": "object"
        +}
    • Changedwhoami1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "key": {
        +      "description": "Name of the API key.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "scope": {
        +      "description": "read or write.",
        +      "type": "string"
        +    },
        +    "username": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "username",
        +    "scope"
        +  ],
        +  "type": "object"
        +}
  12. 27 tool updates
    • First observedadd_comment
    • First observedadd_slide
    • First observedanswer_access_request
    • First observedcreate_presentation
    • First observeddelete_comment
    • First observeddelete_presentation
    • First observeddelete_slide
    • First observededit_blocks
    • First observedget_access
    • First observedget_format
    • First observedget_presentation
    • First observedget_slide
    • First observedget_version
    • First observedlist_access_requests
    • First observedlist_comments
    • First observedlist_history
    • First observedlist_presentations
    • First observedread_presentation
    • First observedreorder_slides
    • First observedrequest_access
    • First observedresolve_comment
    • First observedrestore_version
    • First observedset_access
    • First observedupdate_presentation
    • First observedupdate_slide
    • First observedupload_image
    • First observedwhoami

Publisher details

Operator
EaseWeb · Publisher source
Operator website
https://easeweb.host/
Vendor relationship
First-party · Publisher source
Trust center
Not available
Restrictions
None. Free; requires an EaseWeb account (sign-in with Google, Apple or Yandex, created on first sign-in). No paid plan, admin approval, regional limits or custom OAuth app needed: OAuth works with dynamic client registration or Client ID Metadata Documents.

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources