Jabbertoon cartoon studio
Server Details
Free 2D cartoon studio: moves, characters and looks; check a cartoon; share links. No key.
- Status
- Healthy
- Uptime
- 99.6% over 23 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 8 tools
Most tools target clearly distinct actions: guide retrieval, listing, move lookup, building, validation, sharing, and reporting. The main overlap is that the broad build tool can return links and check steps, which brushes against share_link and validate, and get_move/list_moves are closely related, but the descriptions and examples make the boundaries workable.
All names use snake_case and are action-oriented, with get_ and list_ used consistently for read operations. The bare verbs build, validate, share_link, and report_problem deviate slightly from a strict verb_noun pattern but remain readable and predictable.
Eight tools is well-scoped for a cartoon/3D-builder server that must cover guidance, characters, moves, building, validation, sharing, and problem reporting. Each tool occupies a meaningful role without excessive surface area.
The tool set covers the main authoring lifecycle: learn the format, inspect characters and moves, build or write programs, validate them, share links, and report problems. Minor gaps exist around explicit CRUD-style operations and world/game inventories, but the JSON-authoring and guide-based workflow lets agents work around them.
Available Tools
8 toolsbuildBuild a thing in the 3D builder from steps, and link itBRead-onlyInspect
Builds anything (a character, an animal, a car, a house) in Jabbertoon's 3D builder from steps, as its buttons do: spine, grow, bone (a skeleton, a bone at a time), add a ready part (leg, arm, head, wing, wheel, hat ...), set, copy, remove, look. Checks every step, says what was made (its parts and size) and gives a jabbertoon.com/editor/ link that opens it in the Forge, to change and use in a cartoon, world or game. Over MCP the answer also shows a picture of it from four sides. Steps that start {"op": "new", "kind": "move"} make a move from keys, {"op": "new", "kind": "world"} a world (a level is played to check it), and a game, every one in 3D: "walk" a place to walk at real size (played on foot: told what cannot be reached), or "trench", "space", "surface" or "sky" a game to fly. A refused step says where, why and how to fix it. export_link opens Export, free: STL/3MF to 3D print, glTF (Blender, Unity, Godot), SVG, Minecraft .schem. The steps: get_guide {"topic": "build"}, a game's {"topic": "game"}.
| Name | Required | Description | Default |
|---|---|---|---|
| build | No | A build to change (the build an answer gave); without it the steps start from a new spine. | |
| steps | No | The steps, in order: {op: spine | grow | bone | add | set | copy | remove | look, on (a part, or a name an earlier step gave with as), ...}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says the tool 'Builds anything', makes moves/worlds/games, opens Export, and produces editable links, all of which imply mutation and side effects. The annotations declare readOnlyHint=true, which directly contradicts the described write behavior and export functionality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is front-loaded with the core purpose, but the description is a dense run-on with many parentheticals and asides. It contains useful details, yet it is difficult to scan and some phrases, such as 'a game's {"topic": "game"}', are awkwardly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex nested-step tool with no output schema, the description covers a lot: step validation, returned link, four-side picture over MCP, export formats, and guide topics. Its main completeness gap is that the mutation semantics are described without reconciling them to the read-only annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both `build` and `steps`. The description adds some useful step-form examples, such as {"op": "new", "kind": "move"} and {"op": "new", "kind": "world"}, but much of its parameter discussion is embedded in long prose rather than clearly mapped to the two parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: building a 3D object in Jabbertoon's builder from ordered steps, including moves, worlds, and games. It lists the supported operations (spine, grow, bone, add, set, copy, remove, look) and names get_guide as a related tool, though it does not sharply differentiate itself from sibling tools such as validate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives some contextual guidance: use get_guide {"topic": "build"} for steps and {"topic": "game"} for games, and describes specific step kinds for moves, worlds, and games. However, it does not explicitly say when to use build versus validate or other siblings, nor does it state clear exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_guideRead Jabbertoon's guide for writing a cartoonARead-onlyInspect
Call this first. Returns one topic of Jabbertoon's guide as Markdown (under 20,000 characters): start (what it makes and the order of calls), cartoon (the JSON program: cast, scenes, lines, moves), text (the same cartoon as screenplay text), moves, characters, voices, places, errors, limits, build (the 3D builder's steps), export (a build as STL or 3MF to print, glTF, SVG blueprints, Minecraft), world (a world of blocks), walk (a place to walk), game (a game's steps), song (the editor's own file: characters, lines, moves, shots, a song), market, controls (pills, actions). Units everywhere: x and y are shares of the stage (0 to 1, the ground at 0.92), times are seconds. Example: {"topic": "cartoon"}.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Leave it out for start, which names the others. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and closed-world, but the description adds genuinely new behavioral facts: output is Markdown capped under 20,000 characters, omission of topic defaults to 'start', and coordinate/time unit conventions (x,y as 0-1 shares of stage, ground at 0.92, seconds). It loses a point because the topic list in prose omits several enum values (play, shapes, examples, keys, fight), leaving a mild inconsistency an agent must resolve from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the imperative 'Call this first' and the return format, then the topic glossary, then units and an example. Dense but nearly every clause carries information; the topic parentheticals are the bulk and are justified by helping selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must characterize the return value — it does so with format and size bound, plus unit conventions for the content it describes. Adequate for a one-parameter documentation tool, with only the topic-coverage mismatch against the enum as a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum names the values, but the description goes further by glossing what each topic contains (cartoon = JSON program, export = STL/3MF/glTF/SVG/Minecraft, song = editor's own file), which genuinely aids topic selection. The gloss list does not match the enum exactly, so completeness of the explanation is imperfect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns one topic of Jabbertoon's guide as Markdown') and enumerates the topics, so an agent knows this is the documentation tool rather than an action like build or validate. The 'Call this first' opener also frames its role in the toolset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call it first, and the schema note plus the 'start' topic description ('names the others') tells the agent how to bootstrap. No alternative needs mentioning because no sibling serves the same purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_moveGet one move's program and readable textARead-onlyInspect
Returns one ready-made move: its block program as JSON, the same program as screenplay text, its length in seconds, what it works on, its settings with units, its page and links. Name it by id (c4c:beh:wave_hello), short name (wave_hello) or page slug. To write your own move, start from one, change it, then validate it. Example: {"move": "wave_hello"}.
| Name | Required | Description | Default |
|---|---|---|---|
| move | Yes | Its id, short name or page slug, as list_moves gives them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description goes beyond them by disclosing the exact payload ( program, screenplay rendering, duration in seconds, settings with units) and by noting that moves come 'ready-made' and can be used as a starting point for authoring. It does not mention size limits or error behavior for an unknown move reference.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return contents, then the naming rules, then the authoring workflow, then a call example. Every sentence earns its place, though the run-on enumeration of return fields is dense and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return contract, and it does — itemizing every field the agent will receive. Identifier formats and the follow-on validate step are covered. Missing only edge-case behavior (what happens if the reference is ambiguous or unknown).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already says the value is the id, short name or page slug as list_moves gives them. The description still adds real value by spelling out the three accepted forms and giving a concrete id example ('c4c:beh:wave_hello') plus a call example, removing any guessing about format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns one ready-made move') and then enumerates exactly what comes back: block program JSON, screenplay text, length in seconds, works-on target, settings with units, page and links. The word 'one' plus the enumerations clearly separates it from the sibling list_moves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear authoring workflow: 'To write your own move, start from one, change it, then validate it,' routing the agent to the sibling validate tool. It also explains the three accepted identifier forms, but never states when not to use this tool or what to use instead for bulk retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_charactersList Jabbertoon's ready-made cartoon characters and voicesBRead-onlyInspect
Lists the cast in 3D: the six people (bob, ria, sunny, sam, lee, rose) and the animals (dog, cat, fox, horse, gull, and bear2, fox2, rabbit2, raccoon2, cat2 on two legs), each with the designed entry a cast entry gives it and a voice; the voices a line can use; and cartoon_example, a whole talking cartoon to copy. (The six flat templates of older cartoons are listed too, as characters.) Call it to write a cast: {"dog": {"name": "Biscuit", "look": {"template": "dog", "colors": {"skin": "#8d6e63"}}, "voice": "am_puck"}}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful inventory context (which characters, which voices, cartoon_example) but is vague about the actual return shape ('the designed entry a cast entry gives it') and says nothing about freshness, limits, or how the cast relates to the write path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core purpose, but the middle sentence is a long, grammatically tangled run-on that is hard to parse. Several phrases ('the designed entry a cast entry gives it') add words without adding clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden; it does list the main contents (cast, voices, cartoon_example, flat templates) but explains their structure opaquely. Enough to know roughly what comes back, not enough to know the shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The description even shows the object shape an agent would supply when writing a cast, which is helpful orientation even though it is not a parameter of this tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the cast in 3D') and enumerates the actual members (bob, ria, sunny, sam, lee, rose; dog, cat, fox, etc.), so an agent can distinguish it from list_looks and list_moves. It does not explicitly name a sibling it replaces, but the character/voice inventory makes the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call it to write a cast' plus a concrete JSON sample implies the usage context clearly, but there is no statement of when NOT to call it or which sibling to prefer for other listing needs (looks, moves). Adequate but leaves the alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_movesList Jabbertoon's ready-made cartoon movesARead-onlyInspect
Lists the ready-made moves a character can do (walk in, wave hello, hop, bow, slump, talk...): id, name, length in seconds, the bodies it works on (two legs, four, none), its settings with units, page and links. A does block plays one: {"op": "does", "who": "dog", "behaviour": "c4c:beh:wave_hello"}. q keeps the moves whose words match or that do what a word means (dance finds Groove, scared finds Cower). Example: {"q": "wave"}.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Words to look for ("wave", "dance"); leave it out for every move. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: the full shape of returned records, the fuzzy/semantic nature of q matching, and how the result is consumed in a does block. It omits pagination or ordering behavior, but for a safe read tool this is solid added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and returned fields, followed by search semantics and a compact example. The embedded does-block JSON is slightly tangential to a listing tool, but it is short and directly illustrates why the ids returned here matter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so by enumerating every field, including units on settings. Combined with the search semantics explanation, an agent has enough to invoke and interpret the result; only ordering/pagination detail is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the q parameter is already documented, so the baseline is 3. The description goes further by explaining that q matches words OR meaning ("dance finds Groove, scared finds Cower") and gives a concrete example, adding semantics the schema does not carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and resource (ready-made cartoon moves) and enumerates the returned fields (id, name, length, bodies, settings, page, links). It is clearly distinct from list_characters and list_looks by resource, though it never explicitly contrasts itself with the singular get_move sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: omit q for every move, use q for word/meaning search, and shows how a returned move is played via a does block. It stops short of naming an alternative tool (e.g. get_move) for retrieving a single move, so it is context-rich but not a full when/when-not routing guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_problemTell Jabbertoon something is wrongAInspect
Tells the people who make Jabbertoon something is wrong: a wrong answer, a check that refused a good cartoon or passed a bad one, a move that looks wrong, a link that does not open, wrong docs, something missing, or a step that was hard to get right (kind hard_step, with hard_because: optional, never needed to go on). Unlike the other tools, it keeps what you send: the report (kind, tool, code, where, item, note, hard_because) is saved for a person to read. Never put the cartoon, a name, an address or anything about the person you help in it. Example: {"kind": "validator_wrong", "tool": "validate", "code": "op_unknown", "note": "say was refused in a cartoon"}.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Set by the jabbertoon tool: win32, darwin or linux. | |
| code | No | The error code it gave, e.g. op_unknown. | |
| item | No | What it is about: a move, character or look (c4c:beh:bow, dog, crayon), or a page. | |
| kind | Yes | What kind of problem it is (hard_step: a step that was hard to get right). | |
| note | No | What was wrong, in a sentence or two. No cartoon, names or personal details. | |
| tool | No | The tool whose answer was wrong, e.g. validate. | |
| where | No | Where it pointed, e.g. scripts[0].body[2]. | |
| cli_version | No | Set by the jabbertoon tool. | |
| hard_because | No | For kind hard_step: what made the step hard (an error's words, a field that was unclear, a size that was hard to guess). Optional. No cartoon, names or personal details. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the write/non-idempotent profile; the description adds the crucial facts that the payload is persisted and read by a human, and imposes an explicit privacy prohibition ('Never put the cartoon, a name, an address or anything about the person you help in it'). That is exactly the behavioral context an agent cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then conditions, persistence, privacy rule and an example — every block earns its place. The first sentence is a long run-on with stacked clauses and a redundant parenthetical on hard_because, which slightly hurts readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters, no output schema and a privacy-sensitive payload, the description covers what to send, what must be excluded, and that a human will read it. It does not say what the tool returns or whether submission is acknowledged, which is the only real gap given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 further by grouping the fields that get saved (kind, tool, code, where, item, note, hard_because) and by giving a worked example payload with realistic values. It adds moderate meaning over the schema but does not explain os/cli_version or the item vs where distinction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Tells the people who make Jabbertoon something is wrong') and enumerates the concrete problem categories it handles, making it immediately distinguishable from read-only siblings like validate, get_move or list_moves. An agent can tell what this tool is for 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear triggering conditions ('a wrong answer, a check that refused a good cartoon or passed a bad one, a move that looks wrong, a link that does not open, wrong docs, something missing') and explicitly carves out the hard_step sub-case. It also contrasts the tool with siblings ('Unlike the other tools, it keeps what you send'), though it never states when *not* to file a report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateCheck a Jabbertoon cartoon, scene, move, pack or characterARead-onlyInspect
Checks a cartoon, with the editor's own checks, before anyone sees it. Give one of cartoon, program, pack, character or file. Returns errors (it will not play as written: also a character or background the site lacks) and warnings, each {code, where, says, fix, url}, with did_you_mean and an RFC 6902 patch when certain; issues a viewer would see (off stage, overlapping, an empty stage, a line cut off) with a summary of who is where and says what when (seconds; x as a share of the stage); and, when ok, the canonical program and a link. repair: true also returns the program with every certain patch applied. Nothing you send is kept. Example: list_characters' cartoon_example.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | On your own computer only: a .json or .txt file's name in the output folder. | |
| pack | No | A whole pack: its manifest and its content. | |
| repair | No | true: also return repaired: the program with every certain patch applied, and the changes. | |
| cartoon | No | A cartoon: its program, a cartoon file {cast, program}, a project file, or its screenplay text (read only on your own computer). | |
| program | No | A move (get_move gives ready-made ones) or a scene program. | |
| character | No | Your own character, {"name", "content"}, or a character pack. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses the retention policy ('Nothing you send is kept'), the exact error/warning object shape {code, where, says, fix, url}, the presence of did_you_mean and an RFC 6902 patch 'when certain,' the viewer-facing issue categories, and what repair:true returns. This is unusually rich behavioral disclosure for a read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and return contract with almost no filler, and the example is tacked on usefully at the end. The middle sentences are dense and run-on, which costs a point but not readability of the key facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a nested-object, six-parameter input, the description carries the full return-value burden and does so: error fields, warnings, viewer issues, summary contents, and the ok-path canonical program plus link. Nothing an agent needs to invoke or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 genuine meaning: the mutually alternative inputs (cartoon/program/pack/character/file), the note that get_move supplies ready-made programs, and the semantics of repair:true applying 'every certain patch.' It adds value over the schema rather than repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (checks) and resource (cartoon/program/pack/character/file) plus the timing constraint 'before anyone sees it,' which distinguishes it from build and share_link without naming them. It is clear what the tool does, though sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Give one of cartoon, program, pack, character or file' frames the calling context, and 'before anyone sees it' implies pre-publication validation. It offers a concrete example (list_characters' cartoon_example) but does not explicitly say when not to use it versus build or get_guide.
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.
2 tool updates
- Changed
get_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "start", - "cartoon", - "text", - "moves", - "characters", - "looks", - "voices", - "places", - "errors", - "limits", - "build", - "game", - "song", - "walk", - "play", - "export", - "shapes", - "examples", - "keys", - "world", - "market", - "controls", - "fight" -]New value: +[ + "start", + "cartoon", + "text", + "moves", + "characters", + "voices", + "places", + "errors", + "limits", + "build", + "game", + "song", + "walk", + "play", + "export", + "shapes", + "examples", + "keys", + "world", + "market", + "controls", + "fight" +]
- Removed
list_looks
1 tool update
- Changed
get_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "start", - "cartoon", - "text", - "moves", - "characters", - "looks", - "voices", - "places", - "errors", - "limits", - "build", - "game", - "song", - "walk", - "export", - "shapes", - "examples", - "keys", - "world", - "market", - "controls" -]New value: +[ + "start", + "cartoon", + "text", + "moves", + "characters", + "looks", + "voices", + "places", + "errors", + "limits", + "build", + "game", + "song", + "walk", + "play", + "export", + "shapes", + "examples", + "keys", + "world", + "market", + "controls", + "fight" +]
1 tool update
- Changed
get_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "start", - "cartoon", - "text", - "moves", - "characters", - "looks", - "voices", - "places", - "errors", - "limits", - "build", - "game", - "song", - "walk", - "export", - "shapes", - "examples", - "keys", - "world", - "market" -]New value: +[ + "start", + "cartoon", + "text", + "moves", + "characters", + "looks", + "voices", + "places", + "errors", + "limits", + "build", + "game", + "song", + "walk", + "export", + "shapes", + "examples", + "keys", + "world", + "market", + "controls" +]
1 tool update
- Changed
get_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "start", - "cartoon", - "text", - "moves", - "characters", - "looks", - "voices", - "places", - "errors", - "limits", - "build", - "game", - "song", - "walk", - "export", - "shapes", - "examples", - "keys", - "world" -]New value: +[ + "start", + "cartoon", + "text", + "moves", + "characters", + "looks", + "voices", + "places", + "errors", + "limits", + "build", + "game", + "song", + "walk", + "export", + "shapes", + "examples", + "keys", + "world", + "market" +]
1 tool update
- Changed
report_problem3 fields changed- added
Input schema / properties / hard_becauseAdded value: +{ + "description": "For kind hard_step: what made the step hard (an error's words, a field that was unclear, a size that was hard to guess). Optional. No cartoon, names or personal details.", + "maxLength": 500, + "type": "string" +} - changed
Input schema / properties / kind / descriptionPrevious value: -"What kind of problem it is."New value: +"What kind of problem it is (hard_step: a step that was hard to get right)." - changed
Input schema / properties / kind / enumPrevious value: -[ - "wrong_answer", - "validator_wrong", - "move_looks_wrong", - "link_does_not_open", - "docs_wrong", - "missing", - "other" -]New value: +[ + "wrong_answer", + "validator_wrong", + "move_looks_wrong", + "link_does_not_open", + "docs_wrong", + "missing", + "hard_step", + "other" +]
1 tool update
- Changed
get_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "start", - "cartoon", - "text", - "moves", - "characters", - "looks", - "voices", - "places", - "errors", - "limits", - "build", - "game", - "song" -]New value: +[ + "start", + "cartoon", + "text", + "moves", + "characters", + "looks", + "voices", + "places", + "errors", + "limits", + "build", + "game", + "song", + "walk", + "export", + "shapes", + "examples", + "keys", + "world" +]
1 tool update
- Changed
get_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "start", - "cartoon", - "text", - "moves", - "characters", - "looks", - "voices", - "places", - "errors", - "limits", - "build", - "game" -]New value: +[ + "start", + "cartoon", + "text", + "moves", + "characters", + "looks", + "voices", + "places", + "errors", + "limits", + "build", + "game", + "song" +]
1 tool update
- Changed
build1 field changed- changed
Input schema / properties / steps / descriptionPrevious value: -"The steps, in order: {op: spine | grow | add | set | copy | remove | look, on (a part, or a name an earlier step gave with as), ...}."New value: +"The steps, in order: {op: spine | grow | bone | add | set | copy | remove | look, on (a part, or a name an earlier step gave with as), ...}."
2 tool updates
- Changed
build1 field changed- removed
Input schema / properties / steps / itemsRemoved value: -{ - "type": "object" -}
- Changed
get_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "start", - "cartoon", - "text", - "moves", - "characters", - "looks", - "voices", - "places", - "errors", - "limits", - "build" -]New value: +[ + "start", + "cartoon", + "text", + "moves", + "characters", + "looks", + "voices", + "places", + "errors", + "limits", + "build", + "game" +]
2 tool updates
- Added
build - Changed
get_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "start", - "cartoon", - "text", - "moves", - "characters", - "looks", - "voices", - "places", - "errors", - "limits" -]New value: +[ + "start", + "cartoon", + "text", + "moves", + "characters", + "looks", + "voices", + "places", + "errors", + "limits", + "build" +]
8 tool updates
- Added
get_guide - Changed
get_move2 fields changed- changed
Input schema / properties / move / descriptionPrevious value: -"The move's id (c4c:beh:wave_hello), short name (wave_hello) or page slug, as list_moves gives them."New value: +"Its id, short name or page slug, as list_moves gives them." - changed
Output schema / (root)Previous value: -{ - "$defs": { - "problem": { - "properties": { - "code": { - "type": "string" - }, - "fix": { - "type": [ - "string", - "null" - ] - }, - "says": { - "type": "string" - }, - "where": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "code", - "where", - "says", - "fix" - ], - "type": "object" - } - }, - "properties": { - "content_hash": { - "type": "string" - }, - "description": { - "type": "string" - }, - "error": { - "$ref": "#/$defs/problem" - }, - "id": { - "type": "string" - }, - "license": { - "type": "string" - }, - "links": { - "type": "object" - }, - "name": { - "type": "string" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "type": "boolean" - }, - "pack_slug": { - "type": "string" - }, - "program": { - "description": "The move's block program (JSON).", - "type": "object" - }, - "seconds": { - "type": [ - "number", - "null" - ] - }, - "skeleton": { - "type": "boolean" - }, - "slug": { - "type": "string" - }, - "text": { - "description": "The same program as readable text, one block per line.", - "type": "string" - }, - "url": { - "description": "The move's page on jabbertoon.com (the list of moves when the move is not found).", - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "ok", - "url" - ], - "type": "object" -}New value: +null
- Changed
list_characters1 field changed- changed
Output schema / (root)Previous value: -{ - "$defs": { - "problem": { - "properties": { - "code": { - "type": "string" - }, - "fix": { - "type": [ - "string", - "null" - ] - }, - "says": { - "type": "string" - }, - "where": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "code", - "where", - "says", - "fix" - ], - "type": "object" - } - }, - "properties": { - "cartoon_example": { - "description": "A whole talking cartoon file ({cast, program}) to copy: give it to validate as cartoon.", - "type": "object" - }, - "cast_entry_example": { - "description": "One cast entry that draws the first character: the value under a cast id, as in {\"cast\": {\"A\": <this>}}.", - "type": "object" - }, - "characters": { - "items": { - "properties": { - "colors": { - "description": "The look.colors keys (body, skin, acc), what each paints on this character, and the default colour.", - "type": "array" - }, - "id": { - "description": "The character pack id (c4c:char:<slug>) when the pack is published, else null.", - "type": [ - "string", - "null" - ] - }, - "legs": { - "type": "integer" - }, - "links": { - "description": "Links that open it: studio (put it in a cartoon) and create (start a new character from it).", - "type": "object" - }, - "name": { - "type": "string" - }, - "options": { - "description": "The look.options keys this character has, with their values.", - "type": "array" - }, - "slug": { - "type": "string" - }, - "template": { - "description": "What a cast entry's look.template says to draw this character.", - "type": "string" - }, - "url": { - "description": "The character's page on jabbertoon.com.", - "type": "string" - }, - "views": { - "description": "The views it is drawn in; the first is its own.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "slug", - "name", - "template", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "count": { - "type": "integer" - }, - "error": { - "$ref": "#/$defs/problem" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "type": "boolean" - }, - "url": { - "description": "The page that lists every character.", - "type": "string" - } - }, - "required": [ - "ok", - "url" - ], - "type": "object" -}New value: +null
- Changed
list_looks1 field changed- changed
Output schema / (root)Previous value: -{ - "$defs": { - "problem": { - "properties": { - "code": { - "type": "string" - }, - "fix": { - "type": [ - "string", - "null" - ] - }, - "says": { - "type": "string" - }, - "where": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "code", - "where", - "says", - "fix" - ], - "type": "object" - } - }, - "properties": { - "body_shapes": { - "items": { - "properties": { - "description": { - "type": "string" - }, - "id": { - "description": "What look.shape says.", - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "id", - "name" - ], - "type": "object" - }, - "type": "array" - }, - "count": { - "type": "integer" - }, - "error": { - "$ref": "#/$defs/problem" - }, - "looks": { - "items": { - "properties": { - "description": { - "type": "string" - }, - "id": { - "description": "What look.style says.", - "type": "string" - }, - "links": { - "description": "studio: opens the cartoon studio in this look.", - "type": "object" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The look's page on jabbertoon.com.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "type": "boolean" - }, - "url": { - "description": "The page that shows every look.", - "type": "string" - } - }, - "required": [ - "ok", - "url" - ], - "type": "object" -}New value: +null
- Changed
list_moves2 fields changed- changed
Input schema / properties / q / descriptionPrevious value: -"Words to look for in a move's name, id or description, or what the move does, e.g. \"wave\", \"walk in\" or \"dance\". Leave it out to list every move."New value: +"Words to look for (\"wave\", \"dance\"); leave it out for every move." - changed
Output schema / (root)Previous value: -{ - "$defs": { - "problem": { - "properties": { - "code": { - "type": "string" - }, - "fix": { - "type": [ - "string", - "null" - ] - }, - "says": { - "type": "string" - }, - "where": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "code", - "where", - "says", - "fix" - ], - "type": "object" - } - }, - "properties": { - "count": { - "description": "How many moves are listed here.", - "type": "integer" - }, - "error": { - "$ref": "#/$defs/problem" - }, - "filters": { - "description": "The filters this answer used, exactly as given.", - "type": "object" - }, - "moves": { - "items": { - "properties": { - "description": { - "type": "string" - }, - "id": { - "description": "The pack id, e.g. c4c:beh:wave_hello.", - "type": "string" - }, - "license": { - "type": "string" - }, - "links": { - "description": "Links that open the move: blocks (the block editor) and studio (the cartoon studio).", - "type": "object" - }, - "name": { - "type": "string" - }, - "pack_slug": { - "description": "The short name used in #p= links, e.g. wave_hello.", - "type": "string" - }, - "seconds": { - "description": "How long the move's preview plays, in seconds.", - "type": [ - "number", - "null" - ] - }, - "skeleton": { - "description": "True for the moves that bend chains, reach with hands or turn between views.", - "type": "boolean" - }, - "slug": { - "description": "The last part of the move's page URL.", - "type": "string" - }, - "url": { - "description": "The move's page on jabbertoon.com.", - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "id", - "slug", - "name", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "type": "boolean" - }, - "total": { - "description": "How many moves there are in all.", - "type": "integer" - }, - "url": { - "description": "The page that lists every move.", - "type": "string" - } - }, - "required": [ - "ok", - "url" - ], - "type": "object" -}New value: +null
- Changed
report_problem10 fields changed- added
Input schema / properties / cli_versionAdded value: +{ + "description": "Set by the jabbertoon tool.", + "maxLength": 40, + "type": "string" +} - added
Input schema / properties / codeAdded value: +{ + "description": "The error code it gave, e.g. op_unknown.", + "maxLength": 64, + "type": "string" +} - changed
Input schema / properties / item / descriptionPrevious value: -"What it is about: a move, character or look (c4c:beh:bow, dog, crayon), a tool name, or a jabbertoon.com page."New value: +"What it is about: a move, character or look (c4c:beh:bow, dog, crayon), or a page." - changed
Input schema / properties / note / descriptionPrevious value: -"What was wrong, in a sentence or two. No personal details."New value: +"What was wrong, in a sentence or two. No cartoon, names or personal details." - changed
Input schema / properties / note / maxLengthPrevious value: -1000New value: +500 - added
Input schema / properties / osAdded value: +{ + "description": "Set by the jabbertoon tool: win32, darwin or linux.", + "maxLength": 40, + "type": "string" +} - removed
Input schema / properties / requestRemoved value: -{ - "description": "The tool call that produced the problem, as {\"tool\": \"...\", \"arguments\": {...}}. It is kept with the report, cut to 4,000 characters.", - "type": "object" -} - added
Input schema / properties / toolAdded value: +{ + "description": "The tool whose answer was wrong, e.g. validate.", + "maxLength": 64, + "type": "string" +} - added
Input schema / properties / whereAdded value: +{ + "description": "Where it pointed, e.g. scripts[0].body[2].", + "maxLength": 200, + "type": "string" +} - changed
Output schema / (root)Previous value: -{ - "$defs": { - "problem": { - "properties": { - "code": { - "type": "string" - }, - "fix": { - "type": [ - "string", - "null" - ] - }, - "says": { - "type": "string" - }, - "where": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "code", - "where", - "says", - "fix" - ], - "type": "object" - } - }, - "properties": { - "error": { - "$ref": "#/$defs/problem" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "type": "boolean" - }, - "removed": { - "description": "What was taken out of the report before it was saved (an email address, for example).", - "items": { - "type": "string" - }, - "type": "array" - }, - "report_id": { - "type": "string" - }, - "says": { - "type": "string" - }, - "status": { - "description": "received", - "type": "string" - }, - "url": { - "description": "The page about Jabbertoon's tools for AI assistants.", - "type": "string" - } - }, - "required": [ - "ok", - "url" - ], - "type": "object" -}New value: +null
- Changed
share_link6 fields changed- changed
Input schema / properties / cartoon / descriptionPrevious value: -"A saved cartoon file: {\"cast\"?, \"places\"?, \"program\"}. Links that play one are coming in the next release: the answer is not_yet."New value: +"Its program, a cartoon file {cast, places?, program}, or its screenplay text (read on your own computer only)." - changed
Input schema / properties / cartoon / typePrevious value: -"object"New value: +[ + "object", + "string" +] - changed
Input schema / properties / character / descriptionPrevious value: -"A character: {\"name\": \"...\", \"content\": {...}}, the content of a character pack (tree, legs, kind, height, footprint, ...), or a whole character pack."New value: +"Your own character, {\"name\", \"content\"}, or a character pack." - added
Input schema / properties / fileAdded value: +{ + "description": "On your own computer only: a file's name in the output folder.", + "maxLength": 255, + "type": "string" +} - changed
Input schema / properties / program / descriptionPrevious value: -"A move: a block program {\"v\": 1, \"kind\": \"behaviour\", \"scripts\": [...]}, as get_move returns. A program of kind \"scene\" or \"cartoon\" gets not_yet."New value: +"A move (kind \"behaviour\"), a scene or a cartoon program." - changed
Output schema / (root)Previous value: -{ - "$defs": { - "problem": { - "properties": { - "code": { - "type": "string" - }, - "fix": { - "type": [ - "string", - "null" - ] - }, - "says": { - "type": "string" - }, - "where": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "code", - "where", - "says", - "fix" - ], - "type": "object" - } - }, - "properties": { - "code": { - "description": "The share code: base64url of the UTF-8 canonical JSON, no padding; the part after #c=.", - "type": "string" - }, - "error": { - "$ref": "#/$defs/problem" - }, - "error_count": { - "description": "How many errors the checks found.", - "type": "integer" - }, - "errors": { - "description": "The errors, in order: the first 50 at most (error_count says how many there are).", - "items": { - "$ref": "#/$defs/problem" - }, - "type": "array" - }, - "kind": { - "description": "behaviour, scene, cartoon or character.", - "type": [ - "string", - "null" - ] - }, - "length": { - "description": "The link's length in characters.", - "type": "integer" - }, - "link": { - "description": "The link to give the person.", - "type": "string" - }, - "links": { - "description": "Every page that opens it: blocks, studio, create.", - "type": "object" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "type": "boolean" - }, - "url": { - "description": "The jabbertoon.com page the link opens (with not_yet, the page that says what links open today).", - "type": "string" - }, - "warning_count": { - "description": "How many warnings the checks found.", - "type": "integer" - }, - "warnings": { - "description": "The warnings, in order: the first 50 at most (warning_count says how many there are).", - "items": { - "$ref": "#/$defs/problem" - }, - "type": "array" - } - }, - "required": [ - "ok", - "url" - ], - "type": "object" -}New value: +null
- Changed
validate9 fields changed- removed
Input schema / maxPropertiesRemoved value: -1 - changed
Input schema / properties / cartoon / descriptionPrevious value: -"A saved cartoon file: {\"cast\": {\"<id>\": {\"name\", \"look\": {\"template\", \"style\", \"shape\", \"colors\"}, \"at\": {\"x\", \"y\", \"h\", \"facing\"}}}, \"places\"?, \"program\"}, where program is a kind \"cartoon\" program. list_characters returns a whole one (cartoon_example)."New value: +"A cartoon: its program, a cartoon file {cast, program}, a project file, or its screenplay text (read only on your own computer)." - changed
Input schema / properties / cartoon / typePrevious value: -"object"New value: +[ + "object", + "string" +] - changed
Input schema / properties / character / descriptionPrevious value: -"A character of your own, as share_link takes it: {\"name\": \"...\", \"content\": {...}}, the content of a character pack (tree, legs, kind, height, footprint, ...), or a whole character pack. Its tree is checked part by part. The format: https://jabbertoon.com/docs/packs/"New value: +"Your own character, {\"name\", \"content\"}, or a character pack." - added
Input schema / properties / fileAdded value: +{ + "description": "On your own computer only: a .json or .txt file's name in the output folder.", + "maxLength": 255, + "type": "string" +} - changed
Input schema / properties / pack / descriptionPrevious value: -"A whole pack: the manifest (pack, id, type, version, name, author, license, remixable, derived_from, content_hash) and its content. The format: https://jabbertoon.com/docs/packs/"New value: +"A whole pack: its manifest and its content." - changed
Input schema / properties / program / descriptionPrevious value: -"A block program: {\"v\": 1, \"kind\": \"behaviour\" | \"scene\" | \"cartoon\", \"scripts\": [...]}, as get_move returns. A move is kind \"behaviour\". The language: https://jabbertoon.com/docs/language/"New value: +"A move (get_move gives ready-made ones) or a scene program." - added
Input schema / properties / repairAdded value: +{ + "description": "true: also return repaired: the program with every certain patch applied, and the changes.", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -{ - "$defs": { - "problem": { - "properties": { - "code": { - "type": "string" - }, - "fix": { - "type": [ - "string", - "null" - ] - }, - "says": { - "type": "string" - }, - "where": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "code", - "where", - "says", - "fix" - ], - "type": "object" - } - }, - "properties": { - "checked": { - "description": "What was checked: program, character, pack or cartoon.", - "type": "string" - }, - "error": { - "$ref": "#/$defs/problem" - }, - "error_count": { - "description": "How many errors the checks found.", - "type": "integer" - }, - "errors": { - "description": "The errors, in order: the first 50 at most (error_count says how many there are).", - "items": { - "$ref": "#/$defs/problem" - }, - "type": "array" - }, - "kind": { - "description": "The program's kind (behaviour, scene, cartoon), character, or the pack's type.", - "type": [ - "string", - "null" - ] - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "description": "True when there are no errors.", - "type": "boolean" - }, - "url": { - "description": "The page that describes this format.", - "type": "string" - }, - "warning_count": { - "description": "How many warnings the checks found.", - "type": "integer" - }, - "warnings": { - "description": "The warnings, in order: the first 50 at most (warning_count says how many there are).", - "items": { - "$ref": "#/$defs/problem" - }, - "type": "array" - } - }, - "required": [ - "ok", - "url" - ], - "type": "object" -}New value: +null
7 tool updates
- First observed
get_move - First observed
list_characters - First observed
list_looks - First observed
list_moves - First observed
report_problem - First observed
share_link - First observed
validate
Related MCP Connectors
Make cartoons with consistent characters: pictures, animated clips, talking characters and songs.
Create 2D characters and animations, revise sprites, adjust timing and export assets via OAuth.
Create mascots, animate artwork, and integrate transparent animations into apps and websites.
Turn words, images, and audio into an animated video with MP4 export.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceTurn words, images, and audio into an animated video with MP4 export.MIT
- AlicenseNot gradedqualityAmaintenanceA design studio where AI draws, charts and animates: agents create fully editable hand-drawn visuals, build charts from data, and their edits become stop-motion GIF and video animations. Free, offline, zero-dependency, MIT.4MIT
- AlicenseNot gradedqualityAmaintenanceTurn Excalidraw diagrams into keyframe animations. AI-powered creation via MCP, E2E encrypted sharing, export to MP4/WebM/GIF/SVG.5 npm96MIT
- AlicenseNot gradedqualityCmaintenanceEnables an AI assistant to turn a plain scene description into a stick-figure animation — complete with walks, props, poses, physics-timed arcs and audio — and export it as MP4, WebM or GIF, or save it as an editable project file. Frames are rendered headlessly by the real animation app, so output matches the app's own exporter.GPL 3.0
Glama MCP Gateway
Add one secure layer between your agents and this server.