{"version": "1.0", "serverInfo": {"name": "easeweb", "title": "EaseWeb presentations", "version": "1.0", "websiteUrl": "https://easeweb.host/docs/mcp/", "icons": [{"src": "https://easeweb.host/static/night_gospel/brand/icon.svg", "mimeType": "image/svg+xml", "sizes": ["any"]}, {"src": "https://easeweb.host/static/night_gospel/brand/icon-512.png", "mimeType": "image/png", "sizes": ["512x512"]}]}, "description": "Create, edit, read and review web presentations: slides, linked buttons, pictures, runnable code.", "instructions": "EaseWeb: web presentations made of slides with blocks (text, shape, button, line, image, code).\nWorkflow:\n1. get_format once: every block prop, its default and allowed values.\n2. list_presentations / get_presentation to see yours (ids of slides and blocks).\n3. create_presentation builds a whole presentation in one call; import_presentation turns a .pptx (or an EaseWeb .zip)\n   into one; add_slides / add_slide / update_slide / edit_blocks change it. These answer with ids only; pass\n   \"response\": \"full\" to get every prop back.\n   Coordinates are px on the slide canvas (1280x720 by default). Missing props take the theme's defaults.\n   Link a button to another slide with {\"kind\": \"slide\", \"slide_number\": N}.\n4. Pictures: upload_image (base64) -> use its \"src\".\n   Code blocks: \"code\" + \"lang\"; \"runnable\": true gives viewers a Run button (sql, mongodb, redis, python, bash).\n   The databases of sql / mongodb / redis blocks are made from the presentation's \"database\" scripts\n   (create_presentation / update_presentation); run_code checks a snippet the way the Run button does.\n5. read_presentation reads ANY published presentation as markdown -- also to check your own result.\n6. Notes: add_comment to review a presentation or to answer; list_comments to read what others wrote; resolve_comment when done.\n7. Access: an \"open\" presentation (list_presentations scope \"open\") may be read and edited by anyone; \"public\" is read by\n   everyone, edited by its author and those given access; \"private\" is seen only with access. Without access, call\n   request_access (role \"view\" or \"edit\") -- the author approves it on the site; then retry.\n8. History: every change is a version (list_history, get_version); restore_version goes back and can itself be undone.\n   Before a big change of somebody else's presentation, leave a note (add_comment) saying what and why.\nEvery presentation has an address (url) people can open in a browser.", "transport": {"type": "streamable-http", "url": "https://easeweb.host/mcp/"}, "capabilities": {"tools": {"listChanged": false}}, "authentication": {"required": true, "schemes": ["oauth2"], "resourceMetadata": "https://easeweb.host/.well-known/oauth-protected-resource/mcp", "authorizationServer": "https://easeweb.host", "authorizationServerMetadata": "https://easeweb.host/.well-known/oauth-authorization-server", "scopes": ["read", "write"], "instructionsUrl": "https://easeweb.host/docs/mcp/"}, "tools": [{"name": "whoami", "title": "Who am I", "description": "Who the API key belongs to and what it may do: the user name, the name of the key and its access\n(\"read\" or \"write\").", "inputSchema": {"type": "object", "properties": {}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"username": {"type": "string"}, "key": {"type": ["string", "null"], "description": "Name of the API key."}, "scope": {"type": "string", "description": "read or write."}}, "required": ["username", "scope"]}, "annotations": {"title": "Who am I", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "get_format", "title": "Block format reference", "description": "The complete reference of what a slide can contain: block types with every prop and its default,\nallowed values of every enumerated prop, number ranges, colour props, link kinds, fonts, shapes\nand themes.", "inputSchema": {"type": "object", "properties": {}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"canvas": {"type": "object"}, "types": {"type": "object"}, "enums": {"type": "object"}, "numbers": {"type": "object"}, "colors": {"type": "object"}, "booleans": {"type": "array", "items": {"type": "string"}}, "html": {"type": "string"}, "links": {"type": "object"}}, "required": ["types"]}, "annotations": {"title": "Block format reference", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "list_presentations", "title": "List presentations", "description": "Presentations: \"mine\" (default) -- yours; \"shared\" -- other people's that you were given access to;\n\"open\" -- open presentations of anybody, which every signed-in person or agent may read and edit.\nEach has slug, id, title, description, theme, access level, whether you can edit it, number of slides, address.", "inputSchema": {"type": "object", "properties": {"scope": {"type": "string", "enum": ["mine", "shared", "open"], "description": "Which presentations: \"mine\" (default), \"shared\" with you, or \"open\" ones of anybody."}}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"presentations": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "slug": {"type": "string", "description": "The address of the presentation: /movie/<slug>/."}, "title": {"type": "string"}, "description": {"type": "string"}, "theme": {"type": "string"}, "url": {"type": "string", "description": "The address people open in a browser."}, "owner": {"type": "string", "description": "User name of the author."}, "access": {"type": "string", "description": "open, public or private."}, "can_edit": {"type": "boolean", "description": "Whether you may change it."}, "slides": {"type": "integer", "description": "Number of slides."}}, "required": ["id", "slug", "title"]}}}, "required": ["presentations"]}, "annotations": {"title": "List presentations", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "get_presentation", "title": "Get a presentation for editing", "description": "A presentation you can see, with every slide and every block (ids and complete props), in playback\norder. Use the ids to edit slides and blocks (\"can_edit\" says whether you may). Links to slides show\nboth \"slide\" (id) and \"slide_number\".", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer"}, "slug": {"type": "string", "description": "The address of the presentation: /movie/<slug>/."}, "title": {"type": "string"}, "description": {"type": "string"}, "theme": {"type": "string"}, "url": {"type": "string", "description": "The address people open in a browser."}, "owner": {"type": "string", "description": "User name of the author."}, "access": {"type": "string", "description": "open, public or private."}, "can_edit": {"type": "boolean", "description": "Whether you may change it."}, "slides": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer", "description": "Stable id of the slide."}, "number": {"type": "integer", "description": "1-based position; changes when slides are reordered."}, "name": {"type": "string"}, "w": {"type": "integer"}, "h": {"type": "integer"}, "bg": {"type": "string"}, "fit": {"type": "string"}, "background": {"type": ["string", "null"], "description": "The \"src\" of the background picture, or null."}, "url": {"type": "string", "description": "The address people open in a browser."}, "objects": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "type": {"type": "string", "description": "text, shape, button, line, image or code."}, "props": {"type": "object", "description": "Every prop of the block (see the block format reference)."}}, "required": ["id", "type"]}, "description": "Blocks, bottom to top (\"props\" only in the full form)."}}, "required": ["id", "number", "objects"], "description": "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."}}, "database": {"type": "object", "properties": {"sql": {"type": "string"}, "mongodb": {"type": "string"}, "redis": {"type": "string"}}, "description": "Setup scripts of the databases of runnable code blocks (shown to the author only)."}}, "required": ["id", "slug", "title", "slides"]}, "annotations": {"title": "Get a presentation for editing", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "read_presentation", "title": "Read any presentation", "description": "Read any presentation you can see (not private, or shared with you) the way a person sees it: slide by slide,\nthe texts in reading order, pictures' descriptions, code, and where every button or link leads.\nA card (a shape with a link and the blocks on it that lead to the same place) is one entry of type \"card\"\nwith the ids of all its blocks. format \"markdown\" (default) is compact; \"json\" is structured.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "format": {"type": "string", "enum": ["markdown", "json"], "description": "Result format: \"markdown\" (default, compact) or \"json\" (structured)."}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "description": "With format \"markdown\" (default): {\"markdown\"}; with \"json\": the presentation slide by slide.", "properties": {"id": {"type": "integer"}, "slug": {"type": "string", "description": "The address of the presentation: /movie/<slug>/."}, "title": {"type": "string"}, "description": {"type": "string"}, "theme": {"type": "string"}, "url": {"type": "string", "description": "The address people open in a browser."}, "owner": {"type": "string", "description": "User name of the author."}, "access": {"type": "string", "description": "open, public or private."}, "can_edit": {"type": "boolean", "description": "Whether you may change it."}, "markdown": {"type": "string"}, "slides": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "number": {"type": "integer"}, "name": {"type": "string"}, "url": {"type": "string", "description": "The address people open in a browser."}, "has_background_picture": {"type": "boolean"}, "blocks": {"type": "array", "items": {"type": "object"}, "description": "Texts, pictures, code and links in reading order."}}}}}}, "annotations": {"title": "Read any presentation", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "create_presentation", "title": "Create a presentation", "description": "Create a new presentation of yours, empty or complete in one call. \"slides\" is a list of\n{\"name\", \"w\", \"h\", \"bg\", \"fit\", \"background\", \"objects\": [blocks]}; blocks may link to each other's\nslides with {\"kind\": \"slide\", \"slide_number\": N} (1-based, in this list). Returns the new presentation\nwith the ids of its slides and blocks (every prop too with \"response\": \"full\").", "inputSchema": {"type": "object", "properties": {"title": {"type": "string", "maxLength": 100, "description": "Title (at most 100 characters)."}, "description": {"type": "string", "description": "Description shown on the presentation page (optional)."}, "theme": {"type": "string", "enum": ["light", "paper", "ocean", "coral", "dark", "forest"], "description": "Default colours of the slides and of new blocks."}, "slides": {"type": "array", "items": {"type": "object"}, "description": "Slides with their blocks (optional)."}, "database": {"type": "object", "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": {"sql": {"type": "string", "description": "PostgreSQL SQL that creates and fills the database."}, "mongodb": {"type": "string", "description": "MongoDB shell (mongosh JavaScript) that creates and fills the database."}, "redis": {"type": "string", "description": "Redis commands that creates and fills the database."}}}, "response": {"type": "string", "enum": ["brief", "full"], "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too."}}, "required": ["title"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer"}, "slug": {"type": "string", "description": "The address of the presentation: /movie/<slug>/."}, "title": {"type": "string"}, "description": {"type": "string"}, "theme": {"type": "string"}, "url": {"type": "string", "description": "The address people open in a browser."}, "owner": {"type": "string", "description": "User name of the author."}, "access": {"type": "string", "description": "open, public or private."}, "can_edit": {"type": "boolean", "description": "Whether you may change it."}, "slides": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer", "description": "Stable id of the slide."}, "number": {"type": "integer", "description": "1-based position; changes when slides are reordered."}, "name": {"type": "string"}, "w": {"type": "integer"}, "h": {"type": "integer"}, "bg": {"type": "string"}, "fit": {"type": "string"}, "background": {"type": ["string", "null"], "description": "The \"src\" of the background picture, or null."}, "url": {"type": "string", "description": "The address people open in a browser."}, "objects": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "type": {"type": "string", "description": "text, shape, button, line, image or code."}, "props": {"type": "object", "description": "Every prop of the block (see the block format reference)."}}, "required": ["id", "type"]}, "description": "Blocks, bottom to top (\"props\" only in the full form)."}}, "required": ["id", "number", "objects"], "description": "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."}}, "database": {"type": "object", "properties": {"sql": {"type": "string"}, "mongodb": {"type": "string"}, "redis": {"type": "string"}}, "description": "Setup scripts of the databases of runnable code blocks (shown to the author only)."}}, "required": ["id", "slug", "title", "slides"]}, "annotations": {"title": "Create a presentation", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "update_presentation", "title": "Change title, description, theme or database", "description": "Change the title, description or theme of a presentation you may edit, or (its author only) the setup scripts of\nthe databases its runnable code blocks work in. The theme only sets the defaults of new slides and blocks; existing\nslides keep their colours. The slug (address) does not change.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "title": {"type": "string", "maxLength": 100, "description": "New title (at most 100 characters)."}, "description": {"type": "string", "description": "New description; an empty string removes it."}, "theme": {"type": "string", "enum": ["light", "paper", "ocean", "coral", "dark", "forest"], "description": "Colour theme: the defaults of new slides and blocks."}, "database": {"type": "object", "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": {"sql": {"type": "string", "description": "PostgreSQL SQL that creates and fills the database."}, "mongodb": {"type": "string", "description": "MongoDB shell (mongosh JavaScript) that creates and fills the database."}, "redis": {"type": "string", "description": "Redis commands that creates and fills the database."}}}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer"}, "slug": {"type": "string", "description": "The address of the presentation: /movie/<slug>/."}, "title": {"type": "string"}, "description": {"type": "string"}, "theme": {"type": "string"}, "url": {"type": "string", "description": "The address people open in a browser."}, "owner": {"type": "string", "description": "User name of the author."}, "access": {"type": "string", "description": "open, public or private."}, "can_edit": {"type": "boolean", "description": "Whether you may change it."}, "slides": {"type": "integer", "description": "Number of slides."}, "database": {"type": "object", "properties": {"sql": {"type": "string"}, "mongodb": {"type": "string"}, "redis": {"type": "string"}}, "description": "Setup scripts of the databases of runnable code blocks (shown to the author only)."}}, "required": ["id", "slug", "title"]}, "annotations": {"title": "Change title, description, theme or database", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "delete_presentation", "title": "Delete a presentation", "description": "Delete one of your presentations (it disappears from the site and from the list of presentations).", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"deleted": {"type": "string", "description": "Slug of the deleted presentation."}}, "required": ["deleted"]}, "annotations": {"title": "Delete a presentation", "readOnlyHint": false, "destructiveHint": true, "openWorldHint": false}}, {"name": "get_slide", "title": "Get one slide", "description": "One slide of a presentation you can see, with all of its blocks (ids and complete props).", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "slide_id": {"type": "integer", "description": "The id of a slide (stable, the \"id\" of the slide in the presentation). Its number (position) changes when slides are reordered."}}, "required": ["slug", "slide_id"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer", "description": "Stable id of the slide."}, "number": {"type": "integer", "description": "1-based position; changes when slides are reordered."}, "name": {"type": "string"}, "w": {"type": "integer"}, "h": {"type": "integer"}, "bg": {"type": "string"}, "fit": {"type": "string"}, "background": {"type": ["string", "null"], "description": "The \"src\" of the background picture, or null."}, "url": {"type": "string", "description": "The address people open in a browser."}, "objects": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "type": {"type": "string", "description": "text, shape, button, line, image or code."}, "props": {"type": "object", "description": "Every prop of the block (see the block format reference)."}}, "required": ["id", "type"]}, "description": "Blocks, bottom to top (\"props\" only in the full form)."}}, "required": ["id", "number", "objects"], "description": "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."}, "annotations": {"title": "Get one slide", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "add_slide", "title": "Add a slide", "description": "Add a slide to a presentation you may edit, at the end or at \"position\" (1-based), optionally with its blocks\nright away. Returns the new slide (ids only unless \"response\" is \"full\").", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "position": {"type": "integer", "description": "1-based place; default: the end."}, "name": {"type": "string", "maxLength": 100, "description": "Slide name (at most 100 characters)."}, "w": {"type": "integer", "description": "Canvas width in px (200-4000, default 1280)."}, "h": {"type": "integer", "description": "Canvas height in px (default 720)."}, "bg": {"type": "string", "description": "Background colour, #rrggbb."}, "fit": {"type": "string", "enum": ["contain", "cover", "stretch"], "description": "How the background picture fits."}, "background": {"type": ["string", "null"], "description": "Background picture: the \"src\" of an uploaded picture; null removes it."}, "objects": {"type": "array", "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"}}, "response": {"type": "string", "enum": ["brief", "full"], "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too."}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer", "description": "Stable id of the slide."}, "number": {"type": "integer", "description": "1-based position; changes when slides are reordered."}, "name": {"type": "string"}, "w": {"type": "integer"}, "h": {"type": "integer"}, "bg": {"type": "string"}, "fit": {"type": "string"}, "background": {"type": ["string", "null"], "description": "The \"src\" of the background picture, or null."}, "url": {"type": "string", "description": "The address people open in a browser."}, "objects": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "type": {"type": "string", "description": "text, shape, button, line, image or code."}, "props": {"type": "object", "description": "Every prop of the block (see the block format reference)."}}, "required": ["id", "type"]}, "description": "Blocks, bottom to top (\"props\" only in the full form)."}}, "required": ["id", "number", "objects"], "description": "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."}, "annotations": {"title": "Add a slide", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "add_slides", "title": "Add several slides", "description": "Add several slides at once to a presentation you may edit, at the end or from \"position\" (1-based) on. Each slide is\n{\"name\", \"w\", \"h\", \"bg\", \"fit\", \"background\", \"objects\": [blocks]}. A link {\"kind\": \"slide\", \"slide_number\": N} counts\nthe slides of the presentation as they are after the insertion, so new slides may lead to each other.\nReturns the new slides (ids only unless \"response\" is \"full\").", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "position": {"type": "integer", "description": "1-based place of the first new slide; default: the end."}, "slides": {"type": "array", "items": {"type": "object"}, "minItems": 1, "description": "The slides: [{\"name\", \"w\", \"h\", \"bg\", \"fit\", \"background\", \"objects\"}]."}, "response": {"type": "string", "enum": ["brief", "full"], "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too."}}, "required": ["slug", "slides"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"slides": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer", "description": "Stable id of the slide."}, "number": {"type": "integer", "description": "1-based position; changes when slides are reordered."}, "name": {"type": "string"}, "w": {"type": "integer"}, "h": {"type": "integer"}, "bg": {"type": "string"}, "fit": {"type": "string"}, "background": {"type": ["string", "null"], "description": "The \"src\" of the background picture, or null."}, "url": {"type": "string", "description": "The address people open in a browser."}, "objects": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "type": {"type": "string", "description": "text, shape, button, line, image or code."}, "props": {"type": "object", "description": "Every prop of the block (see the block format reference)."}}, "required": ["id", "type"]}, "description": "Blocks, bottom to top (\"props\" only in the full form)."}}, "required": ["id", "number", "objects"], "description": "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."}, "description": "The new slides."}, "total": {"type": "integer", "description": "Slides in the presentation now."}}, "required": ["slides"]}, "annotations": {"title": "Add several slides", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "update_slide", "title": "Change a slide", "description": "Change a slide: its name, size, background colour / picture, and -- when \"objects\" is given -- its\nCOMPLETE list of blocks: blocks with an existing \"id\" are kept (their props are merged with the given\nones), blocks without an id are added, blocks not in the list are deleted. Returns the slide (ids only unless \"response\" is \"full\").", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "slide_id": {"type": "integer", "description": "The id of a slide (stable, the \"id\" of the slide in the presentation). Its number (position) changes when slides are reordered."}, "name": {"type": "string", "maxLength": 100, "description": "Slide name (at most 100 characters)."}, "w": {"type": "integer", "description": "Canvas width in px (200-4000, default 1280)."}, "h": {"type": "integer", "description": "Canvas height in px (default 720)."}, "bg": {"type": "string", "description": "Background colour, #rrggbb."}, "fit": {"type": "string", "enum": ["contain", "cover", "stretch"], "description": "How the background picture fits."}, "background": {"type": ["string", "null"], "description": "Background picture: the \"src\" of an uploaded picture; null removes it."}, "objects": {"type": "array", "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"}}, "response": {"type": "string", "enum": ["brief", "full"], "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too."}}, "required": ["slug", "slide_id"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer", "description": "Stable id of the slide."}, "number": {"type": "integer", "description": "1-based position; changes when slides are reordered."}, "name": {"type": "string"}, "w": {"type": "integer"}, "h": {"type": "integer"}, "bg": {"type": "string"}, "fit": {"type": "string"}, "background": {"type": ["string", "null"], "description": "The \"src\" of the background picture, or null."}, "url": {"type": "string", "description": "The address people open in a browser."}, "objects": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "type": {"type": "string", "description": "text, shape, button, line, image or code."}, "props": {"type": "object", "description": "Every prop of the block (see the block format reference)."}}, "required": ["id", "type"]}, "description": "Blocks, bottom to top (\"props\" only in the full form)."}}, "required": ["id", "number", "objects"], "description": "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."}, "annotations": {"title": "Change a slide", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "edit_blocks", "title": "Add, change or delete blocks", "description": "Change some blocks of a slide and leave the others alone, in one step:\n\"add\": new blocks [{\"type\", \"props\"}] (placed on top, or at the bottom with \"at_bottom\": true);\n\"update\": [{\"id\", \"props\"}] -- only the given props change. The same props for several blocks at once, like\nselecting them in the editor: {\"ids\": [...], \"props\"}; or for a card and everything drawn on it:\n{\"inside\": <id of the card's background block>, \"props\"} -- that block and every block lying within its\nrectangle (props a block type does not have, like \"link\" of a code block, are skipped for it);\n\"delete\": [block ids]. Returns the slide (ids only unless \"response\" is \"full\").", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "slide_id": {"type": "integer", "description": "The id of a slide (stable, the \"id\" of the slide in the presentation). Its number (position) changes when slides are reordered."}, "add": {"type": "array", "items": {"type": "object"}, "description": "New blocks: [{\"type\", \"props\"}]."}, "update": {"type": "array", "items": {"type": "object"}, "description": "Changes: [{\"id\" | \"ids\": [...] | \"inside\": <card block id>, \"props\"}]."}, "delete": {"type": "array", "items": {"type": "integer"}, "description": "Ids of blocks to delete."}, "at_bottom": {"type": "boolean", "description": "Put the added blocks under the others (default: on top)."}, "response": {"type": "string", "enum": ["brief", "full"], "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too."}}, "required": ["slug", "slide_id"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer", "description": "Stable id of the slide."}, "number": {"type": "integer", "description": "1-based position; changes when slides are reordered."}, "name": {"type": "string"}, "w": {"type": "integer"}, "h": {"type": "integer"}, "bg": {"type": "string"}, "fit": {"type": "string"}, "background": {"type": ["string", "null"], "description": "The \"src\" of the background picture, or null."}, "url": {"type": "string", "description": "The address people open in a browser."}, "objects": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "type": {"type": "string", "description": "text, shape, button, line, image or code."}, "props": {"type": "object", "description": "Every prop of the block (see the block format reference)."}}, "required": ["id", "type"]}, "description": "Blocks, bottom to top (\"props\" only in the full form)."}}, "required": ["id", "number", "objects"], "description": "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."}, "annotations": {"title": "Add, change or delete blocks", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "delete_slide", "title": "Delete a slide", "description": "Delete a slide of your presentation. Links that led to it stop leading anywhere.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "slide_id": {"type": "integer", "description": "The id of a slide (stable, the \"id\" of the slide in the presentation). Its number (position) changes when slides are reordered."}}, "required": ["slug", "slide_id"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"deleted": {"type": "integer", "description": "Id of the deleted slide."}, "slides": {"type": "integer", "description": "Slides left."}}, "required": ["deleted"]}, "annotations": {"title": "Delete a slide", "readOnlyHint": false, "destructiveHint": true, "openWorldHint": false}}, {"name": "reorder_slides", "title": "Reorder slides", "description": "Set the playback order: \"order\" lists the ids of ALL slides of the presentation in the new order.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "order": {"type": "array", "items": {"type": "integer"}, "description": "Every slide id, once."}}, "required": ["slug", "order"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"order": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "number": {"type": "integer"}, "name": {"type": "string"}}}}}, "required": ["order"]}, "annotations": {"title": "Reorder slides", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "upload_image", "title": "Upload a picture", "description": "Store a picture (PNG, JPEG, GIF or WEBP, up to 25 MB, base64-encoded) and get its \"src\" for an image\nblock or a slide background. Big pictures are scaled down to 2560 px.", "inputSchema": {"type": "object", "properties": {"data_base64": {"type": "string", "description": "The file, base64 (a data: URL prefix is allowed)."}}, "required": ["data_base64"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"src": {"type": "string", "description": "Use it as \"src\" of an image block or background."}, "w": {"type": "integer"}, "h": {"type": "integer"}, "url": {"type": "string"}}, "required": ["src"]}, "annotations": {"title": "Upload a picture", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "import_presentation", "title": "Import a PowerPoint or EaseWeb file", "description": "Create a new presentation of yours from a PowerPoint file (.pptx) or an EaseWeb archive (.zip, as exported by the\nsite): slides, texts with their formatting, shapes, pictures, backgrounds and links become editable blocks, the way\nthe \"Import\" button of the site does it. Returns the new presentation (ids only unless \"response\" is \"full\") and\n\"warnings\" about what could not be converted.", "inputSchema": {"type": "object", "properties": {"data_base64": {"type": "string", "description": "The file, base64 (a data: URL prefix is allowed; at most 28 MB)."}, "filename": {"type": "string", "description": "Name of the file, like \"lecture.pptx\" (its extension helps to recognise the format; without a title, it gives the title)."}, "title": {"type": "string", "maxLength": 100, "description": "Title of the new presentation (optional)."}, "response": {"type": "string", "enum": ["brief", "full"], "description": "\"brief\" (default): only the ids, numbers and types of the slides and blocks; \"full\": every prop of every block too."}}, "required": ["data_base64"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer"}, "slug": {"type": "string", "description": "The address of the presentation: /movie/<slug>/."}, "title": {"type": "string"}, "description": {"type": "string"}, "theme": {"type": "string"}, "url": {"type": "string", "description": "The address people open in a browser."}, "owner": {"type": "string", "description": "User name of the author."}, "access": {"type": "string", "description": "open, public or private."}, "can_edit": {"type": "boolean", "description": "Whether you may change it."}, "slides": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer", "description": "Stable id of the slide."}, "number": {"type": "integer", "description": "1-based position; changes when slides are reordered."}, "name": {"type": "string"}, "w": {"type": "integer"}, "h": {"type": "integer"}, "bg": {"type": "string"}, "fit": {"type": "string"}, "background": {"type": ["string", "null"], "description": "The \"src\" of the background picture, or null."}, "url": {"type": "string", "description": "The address people open in a browser."}, "objects": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "type": {"type": "string", "description": "text, shape, button, line, image or code."}, "props": {"type": "object", "description": "Every prop of the block (see the block format reference)."}}, "required": ["id", "type"]}, "description": "Blocks, bottom to top (\"props\" only in the full form)."}}, "required": ["id", "number", "objects"], "description": "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."}}, "database": {"type": "object", "properties": {"sql": {"type": "string"}, "mongodb": {"type": "string"}, "redis": {"type": "string"}}, "description": "Setup scripts of the databases of runnable code blocks (shown to the author only)."}, "warnings": {"type": "array", "items": {"type": "string"}, "description": "What could not be converted."}}, "required": ["id", "slug", "slides"]}, "annotations": {"title": "Import a PowerPoint or EaseWeb file", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "run_code", "title": "Run code", "description": "Run code the way the Run button of a code block does, to check it: \"sql\", \"mongodb\" and \"redis\" run in your own\ndatabase of the presentation (made from its database scripts; what you change stays in it), \"python\" and \"bash\"\nin a sandbox without network that keeps nothing. The presentation itself does not change.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "lang": {"type": "string", "enum": ["sql", "mongodb", "redis", "python", "bash"], "description": "Language of the code."}, "code": {"type": "string", "description": "The code (at most 20000 characters)."}, "reset": {"type": "boolean", "description": "sql, mongodb, redis: first make your database again from the script of the presentation."}}, "required": ["slug", "lang", "code"], "additionalProperties": false}, "outputSchema": {"type": "object", "required": ["lang"], "description": "sql / mongodb / redis: \"results\" (tables, counts or messages), \"notices\" and \"sql_error\"; python / bash: \"stdout\", \"stderr\", \"exit_code\" and \"timed_out\".", "properties": {"lang": {"type": "string"}, "results": {"type": "array", "items": {"type": "object"}}, "notices": {"type": "array", "items": {}}, "sql_error": {"type": ["object", "null"]}, "omitted": {"type": "integer"}, "stdout": {"type": "string"}, "stderr": {"type": "string"}, "exit_code": {"type": ["integer", "null"]}, "timed_out": {"type": "boolean"}, "elapsed_ms": {"type": "integer"}}}, "annotations": {"title": "Run code", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "list_comments", "title": "Read the notes", "description": "Notes on a presentation, as threads with replies. The owner sees every note; anybody else sees the\nthreads they started (and the replies to them). Without \"include_resolved\" only open threads.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "slide_id": {"type": "integer", "description": "The id of a slide (stable, the \"id\" of the slide in the presentation). Its number (position) changes when slides are reordered."}, "include_resolved": {"type": "boolean", "description": "Also return resolved threads (default: only open ones)."}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"comments": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "slide_id": {"type": ["integer", "null"], "description": "null: a note on the whole presentation."}, "slide_number": {"type": ["integer", "null"]}, "author": {"type": "string"}, "agent": {"type": ["string", "null"], "description": "Name of the AI agent that wrote it, if any."}, "text": {"type": "string"}, "resolved": {"type": "boolean"}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}, "replies": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "slide_id": {"type": ["integer", "null"], "description": "null: a note on the whole presentation."}, "slide_number": {"type": ["integer", "null"]}, "author": {"type": "string"}, "agent": {"type": ["string", "null"], "description": "Name of the AI agent that wrote it, if any."}, "text": {"type": "string"}, "resolved": {"type": "boolean"}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}}, "required": ["id", "text"]}}}, "required": ["id", "text"]}}}, "required": ["comments"]}, "annotations": {"title": "Read the notes", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "add_comment", "title": "Leave a note", "description": "Leave a note on any presentation you can see -- on a slide (\"slide_id\") or on the whole presentation --\nor answer a thread (\"reply_to\"). The owner of the presentation sees the note in the viewer; the thread is\nseen by the owner and by whoever started it.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "text": {"type": "string", "maxLength": 4000, "description": "The note (plain text, up to 4000 characters)."}, "slide_id": {"type": "integer", "description": "The id of a slide (stable, the \"id\" of the slide in the presentation). Its number (position) changes when slides are reordered."}, "reply_to": {"type": "integer", "description": "The id of a note to answer."}}, "required": ["slug", "text"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer"}, "slide_id": {"type": ["integer", "null"], "description": "null: a note on the whole presentation."}, "slide_number": {"type": ["integer", "null"]}, "author": {"type": "string"}, "agent": {"type": ["string", "null"], "description": "Name of the AI agent that wrote it, if any."}, "text": {"type": "string"}, "resolved": {"type": "boolean"}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}}, "required": ["id", "text"]}, "annotations": {"title": "Leave a note", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "resolve_comment", "title": "Resolve a note", "description": "Mark a thread as done (or open it again with \"resolved\": false). The owner of the presentation or the\none who started the thread may do it.", "inputSchema": {"type": "object", "properties": {"comment_id": {"type": "integer", "description": "The id of a note."}, "resolved": {"type": "boolean", "description": "Default true."}}, "required": ["comment_id"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer"}, "resolved": {"type": "boolean"}}, "required": ["id", "resolved"]}, "annotations": {"title": "Resolve a note", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "delete_comment", "title": "Delete a note", "description": "Delete a note (with its replies, when it starts a thread). Its author or the owner of the presentation may do it.", "inputSchema": {"type": "object", "properties": {"comment_id": {"type": "integer", "description": "The id of a note."}}, "required": ["comment_id"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"deleted": {"type": "integer", "description": "Id of the deleted note."}}, "required": ["deleted"]}, "annotations": {"title": "Delete a note", "readOnlyHint": false, "destructiveHint": true, "openWorldHint": false}}, {"name": "request_access", "title": "Ask for access", "description": "Ask the author of a presentation for access: \"view\" to read a private one, \"edit\" to change one that is\nnot open. The author sees the request on the site and approves or declines it; then the access belongs\nto your account (you and all of your agents). Asking again updates the pending request.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "role": {"type": "string", "enum": ["view", "edit"], "description": "\"view\" -- read; \"edit\" -- read and change."}, "message": {"type": "string", "description": "Why you need it (optional)."}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer"}, "presentation": {"type": "string", "description": "Slug of the presentation."}, "title": {"type": "string"}, "user": {"type": "string", "description": "Who asks."}, "agent": {"type": ["string", "null"]}, "role": {"type": "string", "description": "view or edit."}, "message": {"type": "string"}, "status": {"type": "string", "description": "pending, approved or declined."}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}}, "required": ["id", "status"]}, "annotations": {"title": "Ask for access", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "list_access_requests", "title": "Access requests", "description": "\"incoming\" (default): requests for access to YOUR presentations (pending ones, or all with\ninclude_decided); \"outgoing\": the requests you (or your agents) sent and their status.", "inputSchema": {"type": "object", "properties": {"direction": {"type": "string", "enum": ["incoming", "outgoing"], "description": "\"incoming\" (default): requests to you; \"outgoing\": requests you sent."}, "include_decided": {"type": "boolean", "description": "Also return approved and declined requests."}}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"requests": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "presentation": {"type": "string", "description": "Slug of the presentation."}, "title": {"type": "string"}, "user": {"type": "string", "description": "Who asks."}, "agent": {"type": ["string", "null"]}, "role": {"type": "string", "description": "view or edit."}, "message": {"type": "string"}, "status": {"type": "string", "description": "pending, approved or declined."}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}}, "required": ["id", "status"]}}}, "required": ["requests"]}, "annotations": {"title": "Access requests", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "answer_access_request", "title": "Answer an access request", "description": "Approve or decline a request for access to one of your presentations. \"role\" may change what is given\n(default: what was asked for).", "inputSchema": {"type": "object", "properties": {"request_id": {"type": "integer", "description": "The id of the access request."}, "approve": {"type": "boolean", "description": "true approves the request, false declines it."}, "role": {"type": "string", "enum": ["view", "edit"], "description": "\"view\" -- read; \"edit\" -- read and change."}}, "required": ["request_id", "approve"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "integer"}, "presentation": {"type": "string", "description": "Slug of the presentation."}, "title": {"type": "string"}, "user": {"type": "string", "description": "Who asks."}, "agent": {"type": ["string", "null"]}, "role": {"type": "string", "description": "view or edit."}, "message": {"type": "string"}, "status": {"type": "string", "description": "pending, approved or declined."}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}}, "required": ["id", "status"]}, "annotations": {"title": "Answer an access request", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "get_access", "title": "Access settings", "description": "The access settings of your presentation: its level (\"open\", \"public\", \"private\"), who was given access\n(and which role), and the pending requests.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"level": {"type": "string", "description": "open, public or private."}, "grants": {"type": "array", "items": {"type": "object", "properties": {"user": {"type": "string"}, "role": {"type": "string"}, "since": {"type": "string", "description": "ISO 8601 date and time."}}}}, "pending_requests": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "presentation": {"type": "string", "description": "Slug of the presentation."}, "title": {"type": "string"}, "user": {"type": "string", "description": "Who asks."}, "agent": {"type": ["string", "null"]}, "role": {"type": "string", "description": "view or edit."}, "message": {"type": "string"}, "status": {"type": "string", "description": "pending, approved or declined."}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}}, "required": ["id", "status"]}}}, "required": ["level"]}, "annotations": {"title": "Access settings", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "set_access", "title": "Change access", "description": "Change the access of your presentation: \"level\" -- \"open\" (every signed-in person and agent reads and\nedits; the history keeps every change), \"public\" (everybody reads, those given access edit) or\n\"private\" (only those given access); \"revoke\" -- usernames whose access is taken away.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "level": {"type": "string", "enum": ["open", "public", "private"], "description": "New access level: \"open\", \"public\" or \"private\"."}, "revoke": {"type": "array", "items": {"type": "string"}, "description": "User names whose access is taken away."}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"level": {"type": "string", "description": "open, public or private."}, "grants": {"type": "array", "items": {"type": "object", "properties": {"user": {"type": "string"}, "role": {"type": "string"}, "since": {"type": "string", "description": "ISO 8601 date and time."}}}}, "pending_requests": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "presentation": {"type": "string", "description": "Slug of the presentation."}, "title": {"type": "string"}, "user": {"type": "string", "description": "Who asks."}, "agent": {"type": ["string", "null"]}, "role": {"type": "string", "description": "view or edit."}, "message": {"type": "string"}, "status": {"type": "string", "description": "pending, approved or declined."}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}}, "required": ["id", "status"]}}}, "required": ["level"]}, "annotations": {"title": "Change access", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}, {"name": "list_history", "title": "History of changes", "description": "The versions of a presentation you can see, newest first: number, who made it (person and agent),\nwhen, and what changed. Changes of one author in a row within 10 minutes are one version.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "limit": {"type": "integer", "description": "At most this many (default 50)."}}, "required": ["slug"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"versions": {"type": "array", "items": {"type": "object", "properties": {"number": {"type": "integer"}, "author": {"type": "string"}, "agent": {"type": ["string", "null"]}, "changes": {"type": "array", "items": {"type": "object"}, "description": "What changed in this version."}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}, "updated_at": {"type": "string", "description": "ISO 8601 date and time."}}, "required": ["number"]}}}, "required": ["versions"]}, "annotations": {"title": "History of changes", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "get_version", "title": "Content of a version", "description": "What a presentation looked like in a version: \"markdown\" (default) -- its slides and texts as\nmarkdown; \"json\" -- the complete content.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "number": {"type": "integer", "description": "The version number."}, "format": {"type": "string", "enum": ["markdown", "json"], "description": "Result format: \"markdown\" (default) or \"json\" (the complete content)."}}, "required": ["slug", "number"], "additionalProperties": false}, "outputSchema": {"type": "object", "required": ["number"], "description": "The version, with \"markdown\" (default) or \"content\" (format \"json\").", "properties": {"number": {"type": "integer"}, "author": {"type": "string"}, "agent": {"type": ["string", "null"]}, "changes": {"type": "array", "items": {"type": "object"}, "description": "What changed in this version."}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}, "updated_at": {"type": "string", "description": "ISO 8601 date and time."}, "markdown": {"type": "string"}, "content": {"type": "object"}}}, "annotations": {"title": "Content of a version", "readOnlyHint": true, "destructiveHint": false, "openWorldHint": false}}, {"name": "restore_version", "title": "Go back to a version", "description": "Make a presentation you may edit look exactly as it did in a version (slides, blocks, order, title).\nThe restore is a new version itself, so it can be undone the same way.", "inputSchema": {"type": "object", "properties": {"slug": {"type": "string", "description": "The presentation's slug (its address: /movie/<slug>/)."}, "number": {"type": "integer", "description": "The version number."}}, "required": ["slug", "number"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"restored": {"type": "integer", "description": "The version that was brought back."}, "version": {"type": "object", "properties": {"number": {"type": "integer"}, "author": {"type": "string"}, "agent": {"type": ["string", "null"]}, "changes": {"type": "array", "items": {"type": "object"}, "description": "What changed in this version."}, "created_at": {"type": "string", "description": "ISO 8601 date and time."}, "updated_at": {"type": "string", "description": "ISO 8601 date and time."}}, "required": ["number"]}}, "required": ["restored"]}, "annotations": {"title": "Go back to a version", "readOnlyHint": false, "destructiveHint": false, "openWorldHint": false}}], "relatedResources": [{"name": "Documentation", "url": "https://easeweb.host/docs/mcp/"}, {"name": "Guide for AI agents", "url": "https://easeweb.host/llms.txt"}, {"name": "Privacy policy", "url": "https://easeweb.host/privacy/"}, {"name": "Terms of service", "url": "https://easeweb.host/terms/"}]}