Turn a few lines of text into a UML state machine diagram document, and check the machine.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when the user wants state machine text checked without a drawing, for example "which states are unreachable?" or "check my state diagram for dead ends". Takes the same diagram text as make_state_diagram. Returns ready true or false; when a line breaks the grammar, the line number, the token and the reason; otherwise the states with incoming and outgoing transition counts, states not reachable from the start, states with no path to the end (both by breadth-first search; a composite state is entered through its own start), and transitions that leave the same state on the same event and guard. Does not draw the diagram or make files, and does not read fork, join, history or concurrent regions.
The state machine in this line grammar, one statement per line, up to 40,000 characters: state Name | state "Long label" as Name | state Name <<choice>> | state Name { ... } (composite, nest up to 3); [*] -> A (start), A -> [*] (end); A -> B: event [guard] / action (after ':' an event, a [guard], a / action, or several in that order; a guard alone suits a transition out of a choice); note A: text; # comments. Declare each state before or after use. Example: "state Idle\nstate Running\n[*] -> Idle\nIdle -> Running: start [ready] / log\nRunning -> Idle: stop\nRunning -> [*]: shutdown".
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http state-diagram https://state-diagram.zovo.one/mcp
Use this when the user wants state machine text checked without a drawing, for example "which states are unreachable?" or "check my state diagram for dead ends". Takes the same diagram text as make_state_diagram. Returns ready true or false; when a line breaks the grammar, the line number, the token and the reason; otherwise the states with incoming and outgoing transition counts, states not reachable from the start, states with no path to the end (both by breadth-first search; a composite state is entered through its own start), and transitions that leave the same state on the same event and guard. Does not draw the diagram or make files, and does not read fork, join, history or concurrent regions.
| Argument | Type | Description |
|---|---|---|
| diagram* | string | The state machine in this line grammar, one statement per line, up to 40,000 characters: state Name | state "Long label" as Name | state Name <<choice>> | state Name { ... } (composite, nest up to 3); [*] -> A (start), A -> [*] (end); A -> B: event [guard] / action (after ':' an event, a [guard], a / action, or several in that order; a guard alone suits a transition out of a choice); note A: text; # comments. Declare each state before or after use. Example: "state Idle\nstate Running\n[*] -> Idle\nIdle -> Running: start [ready] / log\nRunning -> Idle: stop\nRunning -> [*]: shutdown". |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"diagram"
],
"properties": {
"diagram": {
"type": "string",
"maxLength": 100000,
"description": "The state machine in this line grammar, one statement per line, up to 40,000 characters: state Name | state \"Long label\" as Name | state Name <<choice>> | state Name { ... } (composite, nest up to 3); [*] -> A (start), A -> [*] (end); A -> B: event [guard] / action (after ':' an event, a [guard], a / action, or several in that order; a guard alone suits a transition out of a choice); note A: text; # comments. Declare each state before or after use. Example: \"state Idle\\nstate Running\\n[*] -> Idle\\nIdle -> Running: start [ready] / log\\nRunning -> Idle: stop\\nRunning -> [*]: shutdown\"."
}
}
}Use this when the user wants a UML state diagram or state machine drawn, for example "draw the states of an order" or "make a PDF of this state machine". Takes the diagram text in a line grammar: state Name / state "Long label" as Name / state Name <<choice>> / state Name { ... } (composite, nest up to 3); [*] -> A (start), A -> [*] (end); A -> B: event [guard] / action; A -> A: event (self); note A: text; # comments. When the user describes the machine in words, write it in this grammar first. Returns counts, states, transitions in input order, the machine check (unreachable states, states with no path to the end, non-deterministic transitions), a check on the drawing, the PDF page count, an interactive diagram, and PDF, SVG and CSV downloads. Refuses a line outside the grammar with its line number and token. Up to 80 states and 300 transitions. Does not read fork, join, history or concurrent regions. Download links of large diagrams expire after about 1 hour.
| Argument | Type | Description |
|---|---|---|
| title | string | Title printed on the diagram and used in file names, up to 80 characters, e.g. "Order lifecycle". |
| diagram* | string | The state machine in this line grammar, one statement per line, up to 40,000 characters: state Name | state "Long label" as Name | state Name <<choice>> | state Name { ... } (composite, nest up to 3); [*] -> A (start), A -> [*] (end); A -> B: event [guard] / action (after ':' an event, a [guard], a / action, or several in that order; a guard alone suits a transition out of a choice); note A: text; # comments. Declare each state before or after use. Example: "state Idle\nstate Running\n[*] -> Idle\nIdle -> Running: start [ready] / log\nRunning -> Idle: stop\nRunning -> [*]: shutdown". |
| page_size | string |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.
| PDF paper, portrait: letter (default) or a4. Example: a4. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"diagram"
],
"properties": {
"title": {
"type": "string",
"maxLength": 400,
"description": "Title printed on the diagram and used in file names, up to 80 characters, e.g. \"Order lifecycle\"."
},
"diagram": {
"type": "string",
"maxLength": 100000,
"description": "The state machine in this line grammar, one statement per line, up to 40,000 characters: state Name | state \"Long label\" as Name | state Name <<choice>> | state Name { ... } (composite, nest up to 3); [*] -> A (start), A -> [*] (end); A -> B: event [guard] / action (after ':' an event, a [guard], a / action, or several in that order; a guard alone suits a transition out of a choice); note A: text; # comments. Declare each state before or after use. Example: \"state Idle\\nstate Running\\n[*] -> Idle\\nIdle -> Running: start [ready] / log\\nRunning -> Idle: stop\\nRunning -> [*]: shutdown\"."
},
"page_size": {
"enum": [
"letter",
"a4"
],
"type": "string",
"description": "PDF paper, portrait: letter (default) or a4. Example: a4."
}
}
}