Skip to content
Back to agentic-mermaid-mcp

Card snapshot

agentic-mermaid.dev · 2026-07-10 17:25:16 UTC · e82b2e91439d3e05625e3fd311b8739b9d6c8cac4a63be035ad64e71b1f7b8e9

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "name": "agentic-mermaid-mcp",
  "version": "0.1.0",
  "kind": "product",
  "description": "Render, verify, describe, mutate, and build Mermaid diagrams through a stateless Streamable HTTP MCP server.",
  "icon": "https://agentic-mermaid.dev/favicon.svg",
  "url": "https://agentic-mermaid.dev/mcp",
  "serverUrl": "https://agentic-mermaid.dev/mcp",
  "transport": "streamable-http",
  "capabilities": {
    "tools": true,
    "resources": false
  },
  "tools": [
    {
      "name": "execute",
      "description": "Run synchronous JavaScript against the mermaid SDK in an isolated sandbox. Code runs as an expression or statement body \u2014 return the final value. Promise jobs, async/await, and dynamic import are not supported. Multi-step diagram edits should be one execute() call. The SDK declaration is TypeScript-shaped for guidance; the sandbox does not transpile type annotations. Hosted note: execute runs in an on-demand isolate and costs more than the direct render_svg/render_ascii/render_png/verify/describe tools \u2014 prefer those for plain render/verify calls. For straightforward structured edits, prefer the declarative mutate/build tools; reserve execute for logic the ops don't express.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "parameters": {
        "code": {
          "type": "string",
          "description": "JavaScript to execute; mermaid.* SDK is global.",
          "required": true
        },
        "timeoutMs": {
          "type": "number",
          "description": "Optional CPU-time budget (default 5000ms, max 30000ms).",
          "required": false
        }
      }
    },
    {
      "name": "render_svg",
      "description": "Render a Mermaid source string to themeable SVG. Returns { ok, svg }. Layout is deterministic: identical input produces identical geometry.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "parameters": {
        "source": {
          "type": "string",
          "description": "Mermaid source.",
          "required": true
        },
        "theme": {
          "type": "string",
          "description": "Named theme (one of: paper, dusk, zinc-light, zinc-dark, tokyo-night, tokyo-night-storm, tokyo-night-light, catppuccin-mocha, catppuccin-latte, nord, nord-light, dracula, github-light, github-dark, solarized-light, solarized-dark, one-dark, salmon, salmon-dark, tufte, tufte-dark).",
          "required": false
        },
        "bg": {
          "type": "string",
          "description": "Background CSS color (overrides theme).",
          "required": false
        },
        "fg": {
          "type": "string",
          "description": "Foreground CSS color (overrides theme).",
          "required": false
        },
        "style": {
          "description": "Style: a name (hand-drawn, excalidraw, pen-and-ink, freehand, watercolor, blueprint, tufte, accessible-high-contrast, patent-drawing, status-dashboard, ops-schematic, chalkboard, risograph, architectural-plan, publication-figure, or any theme name), an inline style record, or an array stack merged left \u2192 right. A colors-only style is a theme.",
          "required": false
        },
        "seed": {
          "type": "number",
          "description": "Re-rolls ink wobble of styled looks; never moves layout.",
          "required": false
        }
      }
    },
    {
      "name": "render_ascii",
      "description": "Render a Mermaid source string to text. Returns { ok, text }. useAscii true \u2192 plain ASCII (+,-,|); false/absent \u2192 Unicode box drawing (\u250c,\u2500,\u2502).",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "parameters": {
        "source": {
          "type": "string",
          "description": "Mermaid source.",
          "required": true
        },
        "useAscii": {
          "type": "boolean",
          "description": "true = ASCII characters, false = Unicode (default).",
          "required": false
        }
      }
    },
    {
      "name": "render_png",
      "description": "Rasterize a Mermaid source string to PNG. Returns { ok, png_base64 }. Hosted rendering uses resvg-wasm with bundled fonts; bytes may differ from the local napi renderer, so hosted PNG is a convenience surface, not part of the byte-determinism contract. For file/URL artifacts use the local stdio server.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "parameters": {
        "source": {
          "type": "string",
          "description": "Mermaid source.",
          "required": true
        },
        "scale": {
          "type": "number",
          "description": "Output scale multiplier (default 2 \u2014 retina; clamped to 0.1\u20138).",
          "required": false
        },
        "background": {
          "type": "string",
          "description": "CSS color string (default 'white').",
          "required": false
        },
        "style": {
          "description": "Style name | record | stack (same as render_svg). Hosted rasterization bundles the built-in style faces; custom unbundled fonts fall back to DejaVu.",
          "required": false
        },
        "seed": {
          "type": "number",
          "description": "Ink seed for styled looks.",
          "required": false
        }
      }
    },
    {
      "name": "verify",
      "description": "Parse and verify a Mermaid diagram without rendering it. Returns { ok, family, summary, warnings, layout: { bounds, nodes, edges } } for valid diagrams and { ok: false, errors } for parse failures. `family` is the detected diagram family and `summary` a one-line description \u2014 check them: ok:true only means the diagram is structurally valid, not that it is the kind you intended. Warnings use the layout-rubric codes.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "parameters": {
        "source": {
          "type": "string",
          "description": "Mermaid source.",
          "required": true
        }
      }
    },
    {
      "name": "describe",
      "description": "Describe a Mermaid diagram. format=text returns { ok, text } with one or two summary sentences; format=json returns { ok, tree } with the AX tree; format=facts returns { ok, facts } with deterministic semantic fact lines for machine checking (for example edge A -> B : label, member Duck +quack()).",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "parameters": {
        "source": {
          "type": "string",
          "description": "Mermaid source.",
          "required": true
        },
        "format": {
          "type": "string",
          "enum": [
            "text",
            "json",
            "facts"
          ],
          "description": "text (default), json AX tree, or facts semantic read-back.",
          "required": false
        }
      }
    },
    {
      "name": "mutate",
      "description": "Apply a list of structured edit ops to an existing Mermaid `source` and return the edited diagram. This is the declarative counterpart to `execute`: plain JSON in, plain JSON out, no sandbox. Prefer it for straightforward edits; reserve `execute` for logic the ops don't express. Returns { ok, family, source, verify:{ ok, warnings } } on success, or { ok:false, family, opIndex, error } \u2014 where `error` names the offending field and lists the valid ones \u2014 when an op is malformed or cannot apply. Ops apply in order and are all-or-nothing: the first failing op stops the batch (its position is `opIndex`) and the input is left untouched. Each op is { \"kind\": <op>, \u2026fields }. Op kinds by family: ...",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "parameters": {
        "source": {
          "type": "string",
          "description": "Mermaid source to edit.",
          "required": true
        },
        "ops": {
          "type": "array",
          "items": {
            "type": "object"
          },
          "description": "Ordered list of edit ops; each is { kind, ...fields }.",
          "required": true
        }
      }
    },
    {
      "name": "build",
      "description": "Author a new Mermaid diagram from blank by folding a list of structured ops over an empty diagram of `family`. The declarative counterpart to hand-writing source. Returns the same envelope as `mutate`: { ok, family, source, verify } or { ok:false, family, opIndex, error }. Op kinds by family: flowchart: add_node(id, label, shape?, parent?), remove_node(id), rename_node(from, to), set_label(target, label), add_edge(from, to, label?, style?), remove_edge(id) state: add_state(id, label?, parent?), remove_state(id), rename_state(from, to), set_state_label(id, label), add_transition(from, to, label?, parent?), remove_transition(index?, from?, to?, parent?), set_transition_label(index?, from?, ...",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "parameters": {
        "family": {
          "type": "string",
          "description": "Diagram family to author (one of: flowchart, state, sequence, timeline, class, er, journey, architecture, xychart, pie, quadrant, gantt).",
          "required": true
        },
        "ops": {
          "type": "array",
          "items": {
            "type": "object"
          },
          "description": "Ordered list of ops; each is { kind, ...fields }.",
          "required": true
        }
      }
    }
  ],
  "generatedFrom": {
    "packageVersion": "0.1.0",
    "gitSha": "development",
    "buildTime": "development"
  }
}