{
  "data": {
    "category": {
      "area": "design-diagrams",
      "capabilities": [
        "diagram.create",
        "diagram.as-code",
        "diagram.edit",
        "diagram.export",
        "diagram.architecture"
      ],
      "description": "Tools an agent can use to draw architecture, flow and sequence diagrams, through a REST API, an MCP server, an SDK or a diagram-as-code format. Compared on how the diagram is described, whether it stays editable, export formats and what it costs.",
      "indexed": [
        {
          "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/chartforgeai-chartforge.json",
          "kind": "mcp",
          "name": "chartforge",
          "slug": "chartforgeai-chartforge",
          "url": "https://www.anchorterminal.com/tools/chartforgeai-chartforge"
        },
        {
          "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/diagramzu-mcp.json",
          "kind": "mcp",
          "name": "DiagramZu",
          "slug": "diagramzu-mcp",
          "url": "https://www.anchorterminal.com/tools/diagramzu-mcp"
        },
        {
          "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/drillflow-mcp.json",
          "kind": "mcp",
          "name": "DrillFlow",
          "slug": "drillflow-mcp",
          "url": "https://www.anchorterminal.com/tools/drillflow-mcp"
        },
        {
          "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/flowgraf.json",
          "kind": "mcp",
          "name": "Flowgraf",
          "slug": "flowgraf",
          "url": "https://www.anchorterminal.com/tools/flowgraf"
        },
        {
          "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/noddle-draw.json",
          "kind": "mcp",
          "name": "noddle draw",
          "slug": "noddle-draw",
          "url": "https://www.anchorterminal.com/tools/noddle-draw"
        },
        {
          "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/vithanco-vgraph-mcp.json",
          "kind": "mcp",
          "name": "vgraph-mcp",
          "slug": "vithanco-vgraph-mcp",
          "url": "https://www.anchorterminal.com/tools/vithanco-vgraph-mcp"
        }
      ],
      "indexedCount": 6,
      "json": "https://www.anchorterminal.com/categories/diagramming.json",
      "name": "Diagramming",
      "slug": "diagramming",
      "test": "",
      "title": "Diagramming APIs and diagram-as-code for AI agents",
      "toolCount": 10,
      "tools": [
        "miro",
        "drawio",
        "tldraw",
        "lucid",
        "structurizr",
        "diagrams-so",
        "whimsical",
        "eraser",
        "cloudviz",
        "mermaid-chart"
      ],
      "url": "https://www.anchorterminal.com/categories/diagramming"
    },
    "tools": [
      {
        "slug": "miro",
        "name": "Miro API + MCP",
        "vendor": "Miro",
        "vendorUrl": "https://miro.com",
        "kind": "http-api",
        "category": "design",
        "summary": "Miro's REST API v2 reads and writes boards and board items (sticky notes, shapes, connectors, frames, cards, text, images, documents), tags and members, so an agent can lay out diagrams as well as notes.",
        "url": "https://www.anchorterminal.com/tools/miro",
        "markdownUrl": "https://www.anchorterminal.com/tools/miro.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/miro.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/miro.json",
        "repo": "https://github.com/miroapp/miro-ai",
        "license": "proprietary",
        "transports": [
          "http",
          "streamable-http"
        ],
        "remoteUrl": "https://api.miro.com/v2",
        "packages": [
          {
            "registry": "npm",
            "name": "@mirohq/miro-api"
          }
        ],
        "auth": "oauth",
        "authNotes": "REST uses OAuth 2.0 tokens from a Miro app you create in the developer settings, with scopes such as boards:read and boards:write. The MCP server uses OAuth 2.1 with dynamic client registration and sees only boards the user can already open. On Enterprise, MCP is off until an admin enables it.",
        "pricing": "freemium",
        "pricingNotes": "Free plan with 3 editable boards. Starter $8 and Business $20 per member a month billed yearly (about 20 per cent more monthly). Enterprise custom, from 30 members. The REST API works on every plan. MCP tool calls a day are 100 on Free, 500 on Starter, 2,000 on Business and 10,000 on Enterprise (https://miro.com/pricing/).",
        "priceSummary": "$8 / seat-mo",
        "where": "hosted",
        "x402": {
          "level": "no",
          "evidence": "No payment support in the REST or MCP docs.",
          "endpoints": []
        },
        "toolCount": 18,
        "popularity": {
          "githubStars": 156,
          "npmWeekly": 19028,
          "pypiWeekly": null,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://developers.miro.com/docs/rest-api-reference-guide",
        "llmsTxt": "https://developers.miro.com/llms.txt",
        "openapi": "https://raw.githubusercontent.com/miroapp/api-clients/main/packages/generator/spec.json",
        "registryName": "io.github.miroapp/mcp-server",
        "capabilities": [
          "design.files",
          "design.canvas",
          "design.comments",
          "diagram.create",
          "diagram.edit"
        ],
        "tags": [
          "hosted",
          "freemium",
          "free-tier",
          "no-card",
          "closed-source",
          "mcp",
          "llms-txt",
          "openapi",
          "typescript",
          "enterprise"
        ],
        "lastRelease": "2026-09-17",
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 65.3,
          "grade": "B",
          "agentReady": false,
          "rank": 175,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 2,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 63,
            "maintenance": 77,
            "payments": 30,
            "reliability": 73,
            "schema": 85,
            "security": 70,
            "transparency": 79
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": -3,
          "negativeNotes": [
            "-3: the changelog announced on 2026-09-08 that legacy MCP board tools would go, with a migration deadline of 14 September, and removed them on 2026-09-17. Notice was given, but nine days is short for a breaking change, so the lowest deduction (https://developers.miro.com/changelog.rss)."
          ],
          "verdict": "REST creates shapes, connectors and frames, so flowcharts and architecture sketches can be drawn directly. Legacy MCP board tools were removed nine days after the deprecation notice.",
          "strengths": [
            "REST creates shapes, connectors and frames, so flowcharts and architecture sketches can be drawn directly",
            "Hosted MCP server with OAuth 2.1 on every plan including Free, and no delete tool in its 18",
            "Published REST credit limits and MCP daily caps per plan",
            "ISO/IEC 27001, SOC 2 Type II, a public bug bounty and four data-residency regions",
            "Dated changelog with an RSS feed"
          ],
          "weaknesses": [
            "Legacy MCP board tools were removed nine days after the deprecation notice",
            "No prompt-injection guidance for board content written by collaborators",
            "OAuth scopes are coarse (`boards:read`, `boards:write`)",
            "The official Node client hasn't been released since February 2025",
            "MCP daily caps are low on Free (100) and Starter (500)"
          ],
          "agentNotes": [
            "Create shapes first, then connectors with `startItem` and `endItem` ids",
            "Put related items in a frame and set `parent` so they move together",
            "Watch `X-RateLimit-Remaining`. There's no `Retry-After`, so back off exponentially on 429",
            "Through MCP, call `canvas_read_as_svg` before `canvas_update_from_svg` so the model sees the current layout",
            "Don't call the legacy MCP board tools. They were removed on 17 September 2026"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 4,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "B",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 65.3
            }
          ],
          "editorialScores": {
            "ergonomics": 63,
            "maintenance": 77,
            "payments": 30,
            "reliability": 73,
            "schema": 85,
            "security": 70,
            "transparency": 67
          },
          "provenanceScore": 90
        },
        "connect": {
          "http": "curl https://api.miro.com/v2/boards -H \"Authorization: Bearer $MIRO_ACCESS_TOKEN\"",
          "claudeCode": "claude mcp add --transport http miro https://mcp.miro.com/",
          "config": {
            "mcpServers": {
              "miro": {
                "url": "https://mcp.miro.com/"
              }
            }
          }
        },
        "letme": {
          "capability": "https://letme.dev/design.files",
          "tool": "https://letme.dev/miro"
        },
        "alsoIn": [
          "diagramming"
        ],
        "area": "design-diagrams",
        "unitPrices": [
          {
            "item": "Starter plan",
            "unit": "seat-month",
            "usd": 8,
            "note": "billed yearly, API and MCP included"
          },
          {
            "item": "Business plan",
            "unit": "seat-month",
            "usd": 20,
            "note": "billed yearly"
          }
        ],
        "provenance": {
          "legalEntity": "RealtimeBoard Inc. dba Miro",
          "domain": "miro.com",
          "domainRegistered": "1995-09-08",
          "domainNote": "miro.com was registered in 1995, long before RealtimeBoard renamed itself Miro in 2019.",
          "endpointOnVendorDomain": true,
          "terms": "https://miro.com/legal/terms-of-service/",
          "privacy": "https://miro.com/legal/privacy-policy/",
          "statusPage": "https://status.miro.com",
          "changelog": "https://developers.miro.com/changelog",
          "securityTxt": "none",
          "checked": "2026-09-30",
          "score": 90
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/miro.json",
        "live": {
          "slug": "miro",
          "probe": {
            "target": "https://api.miro.com/v2",
            "method": "get",
            "lastAt": "2026-10-05T00:15:26.62994539Z",
            "lastOk": true,
            "lastStatus": 404,
            "lastMs": 49,
            "authRequired": false,
            "uptime24h": 100,
            "uptime30d": 99.91,
            "p50ms24h": 68,
            "p95ms24h": 123,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 35
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 275
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 248
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 271
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 272
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "vendorStatus": {
            "page": "https://status.miro.com",
            "indicator": "none",
            "summary": "All Systems Operational",
            "checkedAt": "2026-10-05T00:11:25.651682928Z"
          },
          "versions": [
            {
              "registry": "mcp-registry",
              "name": "io.github.miroapp/mcp-server",
              "version": "1.0.2",
              "seenAt": "2026-10-04T23:42:40.113054682Z"
            },
            {
              "registry": "npm",
              "name": "@mirohq/miro-api",
              "version": "2.2.4",
              "seenAt": "2026-10-04T16:33:18.699471156Z"
            }
          ],
          "githubStars": 159,
          "npmWeekly": 23752,
          "securityTxt": {
            "url": "https://miro.com/.well-known/security.txt",
            "state": "none",
            "checkedAt": "2026-10-04T15:15:40.18940121Z"
          },
          "llmsTxt": {
            "url": "https://developers.miro.com/llms.txt",
            "ok": true,
            "status": 200,
            "checkedAt": "2026-10-04T15:17:58.983960622Z"
          },
          "domain": {
            "domain": "miro.com",
            "registered": "1995-09-08",
            "source": "https://rdap.verisign.com/com/v1/domain/miro.com",
            "checkedAt": "2026-10-04T13:10:39.715166897Z"
          },
          "pages": [
            {
              "url": "https://developers.miro.com/changelog",
              "kind": "changelog",
              "status": 200,
              "checkedAt": "2026-10-04T15:42:59.013238468Z",
              "changedAt": "2026-10-04T15:42:59.013238468Z",
              "fingerprint": "e14c99df0851"
            },
            {
              "url": "https://miro.com/pricing/",
              "kind": "pricing",
              "status": 200,
              "checkedAt": "2026-10-04T15:46:03.716994192Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "a1d5947bca11"
            },
            {
              "url": "https://miro.com/legal/privacy-policy/",
              "kind": "privacy",
              "status": 200,
              "checkedAt": "2026-10-04T15:45:59.582490288Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "143fa2733740"
            },
            {
              "url": "https://miro.com/legal/terms-of-service/",
              "kind": "terms",
              "status": 200,
              "checkedAt": "2026-10-04T15:46:01.674619063Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "64f4211c5b7e"
            }
          ],
          "updatedAt": "2026-10-05T00:15:26.62994539Z"
        }
      },
      {
        "slug": "drawio",
        "name": "draw.io + MCP",
        "vendor": "draw.io",
        "vendorUrl": "https://www.drawio.com",
        "kind": "mcp",
        "category": "diagramming",
        "summary": "The open-source diagram editor (also diagrams.net) with an official MCP server.",
        "url": "https://www.anchorterminal.com/tools/drawio",
        "markdownUrl": "https://www.anchorterminal.com/tools/drawio.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/drawio.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/drawio.json",
        "repo": "https://github.com/jgraph/drawio",
        "license": "Apache-2.0",
        "transports": [
          "streamable-http",
          "stdio"
        ],
        "remoteUrl": "https://mcp.draw.io/mcp",
        "packages": [
          {
            "registry": "npm",
            "name": "@drawio/mcp"
          }
        ],
        "auth": "none",
        "authNotes": "No keys anywhere. The hosted MCP App, the npm tool server, the web editor and the embed mode are all open. Diagrams live in files or in the storage you pick (Google Drive, OneDrive, GitHub, local).",
        "pricing": "free",
        "pricingNotes": "The web app, desktop app, MCP servers and assistant plugins are free. The source is Apache 2.0 and self-hostable with Docker. Only the Confluence and Jira apps are paid, sold per user through the Atlassian Marketplace (https://www.drawio.com/docs/integrations/atlassian/licensing/).",
        "priceSummary": "Free · OSS",
        "where": "both",
        "x402": {
          "level": "no",
          "endpoints": []
        },
        "toolCount": 2,
        "popularity": {
          "githubStars": 8497,
          "npmWeekly": 24959,
          "pypiWeekly": null,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://www.drawio.com/docs/manual/generate/drawio-mcp-server/",
        "registryName": "io.draw/mcp",
        "capabilities": [
          "diagram.create",
          "diagram.as-code",
          "diagram.edit",
          "diagram.export",
          "diagram.architecture"
        ],
        "tags": [
          "open-source",
          "self-hosted",
          "local",
          "hosted",
          "mcp",
          "diagram-as-code",
          "free-tier",
          "no-card"
        ],
        "lastRelease": "2026-10-01",
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 62.4,
          "grade": "B",
          "agentReady": false,
          "rank": 219,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 1,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 49,
            "maintenance": 86,
            "payments": 60,
            "reliability": 50,
            "schema": 82,
            "security": 55,
            "transparency": 74
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": 0,
          "verdict": "Free, keyless and Apache 2.0, with a Docker image for self-hosting. Tool descriptions embed a 34.5 KB XML reference and a 14 KB Mermaid reference, roughly 13,000 tokens.",
          "strengths": [
            "Free, keyless and Apache 2.0, with a Docker image for self-hosting",
            "The hosted `create_diagram` takes Mermaid or draw.io XML, with optional ELK layout and libavoid edge routing",
            "`search_shapes` covers about 10,000 stencils plus an icon service and returns exact style strings",
            "At least 20 core releases between 15 July and 1 October 2026, and MCP commits most days",
            "Listed in the official MCP registry as io.draw/mcp"
          ],
          "weaknesses": [
            "Tool descriptions embed a 34.5 KB XML reference and a 14 KB Mermaid reference, roughly 13,000 tokens",
            "No REST API to save, list or render diagrams",
            "PNG, SVG and PDF export need draw.io Desktop's CLI or a person in the editor",
            "No rate limits, SLA or security.txt, and mcp.draw.io isn't on the status page",
            "The npm tool server's seven tools carry no readOnlyHint or destructiveHint annotations"
          ],
          "agentNotes": [
            "Pass `mermaid` to `create_diagram` for any type on its Mermaid list. Use `xml` only for icons, mockups or hand-placed layouts",
            "Call `search_shapes` before writing XML with cloud or network icons, so the style strings are exact",
            "Set `postLayout: \"elk\"` for flowcharts or `routing: \"libavoid\"` for hand-placed diagrams, never both",
            "Use the npm server or the plugin when the diagram mustn't leave the machine. The hosted App sends it to draw.io's server",
            "Expect the tool list to cost about 13,000 tokens before the first call"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 4,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "B",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 62.4
            }
          ],
          "editorialScores": {
            "ergonomics": 49,
            "maintenance": 86,
            "payments": 60,
            "reliability": 50,
            "schema": 82,
            "security": 55,
            "transparency": 58
          },
          "provenanceScore": 90
        },
        "connect": {
          "install": "npx -y @drawio/mcp",
          "claudeCode": "claude mcp add --transport http drawio https://mcp.draw.io/mcp",
          "config": {
            "mcpServers": {
              "drawio": {
                "args": [
                  "-y",
                  "@drawio/mcp"
                ],
                "command": "npx"
              }
            }
          }
        },
        "letme": {
          "capability": "https://letme.dev/diagram.create",
          "tool": "https://letme.dev/drawio"
        },
        "area": "design-diagrams",
        "provenance": {
          "legalEntity": "draw.io Ltd",
          "domain": "drawio.com",
          "domainRegistered": "2008-07-10",
          "endpointOnVendorDomain": true,
          "terms": "https://www.drawio.com/trust/terms-of-use/",
          "privacy": "https://www.drawio.com/trust/",
          "statusPage": "https://status.draw.io",
          "changelog": "https://github.com/jgraph/drawio/blob/dev/ChangeLog",
          "securityTxt": "none",
          "checked": "2026-10-01",
          "notes": [
            "draw.io Limited is registered in England and Wales, company number 04051179, at Artisans' House, 7 Queensbridge, Northampton, NN4 7BF (privacy policy v2.1, 30 August 2023)",
            "The hosted MCP runs on draw.io, the company's own product domain",
            "The Better Stack status page monitors app.diagrams.net and the Atlassian apps, not mcp.draw.io",
            "/.well-known/security.txt returns 404"
          ],
          "score": 90
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/drawio.json",
        "live": {
          "slug": "drawio",
          "probe": {
            "target": "https://mcp.draw.io/mcp",
            "method": "mcp-initialize",
            "lastAt": "2026-10-05T00:15:22.744605032Z",
            "lastOk": true,
            "lastStatus": 200,
            "lastMs": 50,
            "lastNote": "initialize answered",
            "authRequired": false,
            "uptime24h": 100,
            "uptime30d": 100,
            "p50ms24h": 56,
            "p95ms24h": 96,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 35
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 276
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 248
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 271
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 272
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "vendorStatus": {
            "page": "https://status.draw.io",
            "indicator": "unknown",
            "summary": "no machine-readable status found",
            "checkedAt": "2026-10-04T21:39:56.565605865Z"
          },
          "versions": [
            {
              "registry": "github",
              "name": "jgraph/drawio",
              "version": "v32.0.2",
              "released": "2026-10-03",
              "seenAt": "2026-10-04T16:25:46.208805858Z"
            },
            {
              "registry": "mcp-registry",
              "name": "io.draw/mcp",
              "version": "1.0.3",
              "seenAt": "2026-10-04T23:42:40.113054682Z"
            },
            {
              "registry": "npm",
              "name": "@drawio/mcp",
              "version": "1.6.3",
              "seenAt": "2026-10-04T16:25:45.29980521Z"
            }
          ],
          "githubStars": 8555,
          "npmWeekly": 37069,
          "securityTxt": {
            "url": "https://drawio.com/.well-known/security.txt",
            "state": "none",
            "checkedAt": "2026-10-04T15:16:01.785159206Z"
          },
          "domain": {
            "domain": "drawio.com",
            "registered": "2008-07-10",
            "source": "https://rdap.verisign.com/com/v1/domain/drawio.com",
            "checkedAt": "2026-10-04T13:06:30.958217093Z"
          },
          "pages": [
            {
              "url": "https://raw.githubusercontent.com/jgraph/drawio/dev/ChangeLog",
              "kind": "changelog",
              "status": 200,
              "checkedAt": "2026-10-04T15:47:43.271864498Z",
              "changedAt": "2026-10-04T15:47:43.271864498Z",
              "fingerprint": "c06458952376"
            },
            {
              "url": "https://www.drawio.com/trust/",
              "kind": "privacy",
              "status": 200,
              "checkedAt": "2026-10-04T15:50:04.544913738Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "9dc01c39a16b"
            },
            {
              "url": "https://www.drawio.com/trust/terms-of-use/",
              "kind": "terms",
              "status": 200,
              "checkedAt": "2026-10-04T15:50:06.619464375Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "82b2faf834d6"
            }
          ],
          "mcpTools": {
            "url": "https://mcp.draw.io/mcp",
            "checkedAt": "2026-10-04T22:19:25.095363394Z",
            "status": "ok",
            "protocol": "2025-11-25",
            "tools": [
              {
                "name": "create_diagram",
                "title": "Create Diagram",
                "description": "Creates and displays an interactive draw.io diagram. Accepts either draw.io XML or Mermaid.js syntax — provide exactly one.\n\n**Format decision — this is the first thing to settle before you write anything:** if the diagram type appears on the Mermaid list below, use `mermaid`. Only use `xml` when the diagram type isn't on that list (UI mockups, floorplans, cloud/network/electrical architecture with stencils, hand-placed UML, etc.) or when the user has explicitly asked for draw.io XML.\n\n**Use Mermaid** for the following diagram types (all rendered natively, no upstream mermaid runtime):\n  - flowchart / graph (TD, LR, …)\n  - sequenceDiagram\n  - classDiagram\n  - stateDiagram / stateDiagram-v2\n  - erDiagram\n  - gantt\n  - pie\n  - journey (user-journey)\n  - gitGraph\n  - mindmap\n  - timeline\n  - quadrantChart\n  - xychart-beta\n  - sankey-beta\n  - requirementDiagram\n  - C4Context / C4Container / C4Component\n  - block-beta\n  - architecture-beta\n  - packet-beta\n  - kanban\n  - radar-beta\n  - treemap-beta\n  - treeview-beta (draw.io-specific)\n  - venn (draw.io-specific) — syntax: `venn` then `set A [\"Label\"]` for each set, `union A,B` for declared overlaps (informational), and `text A` / `text A,B` followed by `[\"Region label\"]` for text inside a region. Do NOT use `A AND B[...]` or `A[\"...\"]` shorthand — those lines are ignored.\n  - ishikawa (draw.io-specific)\n  - zenuml\n**Strong default: use Mermaid for every diagram type on that list above.** Mermaid is simpler, more reliable, and the native Mermaid layout handles positioning and routing for you. For a flowchart, state diagram, sequence, ER, class, gantt, gitGraph, mindmap, etc. — reach for the `mermaid` parameter, not `xml`. Do not default to XML for flowcharts.\n\n**Use XML** when the diagram type isn't on the Mermaid list above OR when the user explicitly asks for XML / draw.io format. Typical cases where XML is the right choice:\n- **UI mockups / wireframes / screen designs** — buttons, form fields, sidebars, modal dialogs (`shape=mxgraph.bootstrap.*`, `shape=mxgraph.ios.*`, `shape=mxgraph.android.*`)\n- **Floor plans / seating charts / room layouts** — rooms, doors, furniture (`shape=mxgraph.floorplan.*`)\n- **Cloud architecture** with AWS / Azure / GCP / Kubernetes icons (`shape=mxgraph.aws4.*`, `shape=mxgraph.azure.*`, `shape=mxgraph.gcp2.*`, `shape=mxgraph.kubernetes.*`)\n- **Network topology** with Cisco / Rack / networking shapes (`shape=mxgraph.cisco*.*`, `shape=mxgraph.rack.*`, `shape=mxgraph.networking.*`)\n- **P\u0026ID / electrical / engineering schematics** (`shape=mxgraph.pid2.*`, `shape=mxgraph.electrical.*`, `shape=mxgraph.mscae.*`)\n- **Swimlanes / pools** with custom colors and hand-placed contents\n- **UML class / component / deployment diagrams** where positioning carries meaning\n- **Venn diagrams, quadrant charts, concept maps** with custom regions — anything where hand-placed geometry is the point\n- **Any diagram requiring specific colors, fonts, stencils, or layouts** that Mermaid can't control precisely\nCall `search_shapes` first when you need industry icons (AWS / Azure / Cisco / P\u0026ID / Kubernetes / floorplan / mockup / electrical) or brand logos / pictorial concept icons (e.g. 'react', 'slack', 'shopping cart') to find the correct `style` string for each shape.\n\n---\n\n**XML reasoning discipline (applies ONLY when you chose XML — skip this whole section if you're using Mermaid):** Your job in XML is declaring logical structure — nodes, edges, labels, groupings. Follow these steps in order: (1) **Decide `postLayout` and `routing` FIRST, before writing any XML.** If the XML diagram is a flowchart, state diagram, decision tree, or any directional/hierarchical process diagram (which you should rarely be writing as XML — prefer Mermaid), you MUST pass `postLayout: \"elk\"` (add `direction: \"horizontal\"` when the flow is drawn left-to-right; it defaults to vertical). Omit `postLayout` only when the layout carries hand-crafted meaning (swimlanes, containers, architecture, UML) — the typical reason you chose XML in the first place. When `postLayout` is set, your x/y coordinates only need to express rough direction; ELK re-lays out the vertices. For those hand-placed diagrams where you omit `postLayout`, consider `routing: \"libavoid\"` — it leaves your positions untouched and only routes the edges around the boxes in clean right angles (set it whenever connectors would otherwise overlap or cut through shapes). Treat `postLayout` and `routing` as alternatives: ELK already routes its own edges, so if you set `postLayout: \"elk\"` do NOT also set `routing` (redundant); use `routing` only on a hand-placed layout where you are NOT re-laying-out with ELK. (2) Pick ONE concrete scenario on your first impulse and commit — do not pitch alternatives, do not flip-flop between approaches. (3) Use the rigid grid in the XML reference (`x = col*180 + 40`, `y = row*120 + 40`) without computing spacings, canvas dimensions, or overlap checks. (4) Never add `\u003cArray as=\"points\"\u003e` waypoints or `exitX/exitY/entryX/entryY` — when postLayout or routing runs it sets them; otherwise drawio's edge router handles it. (5) Do NOT narrate in your reasoning: no \"building the diagram\", no column enumeration, no coordinate math in prose, no coordinate re-verification after placement. Go straight to XML.\n\n**User preference override — XML only.** If the user expresses a preference for draw.io XML over Mermaid in any phrasing (examples: \"no mermaid\", \"skip mermaid\", \"use xml\", \"I want drawio format\", \"stop using mermaid\", \"give me the xml\", \"native drawio only\", etc.), from that point onward in the conversation you MUST use the `xml` parameter exclusively and MUST NOT use the `mermaid` parameter, even for diagram types where Mermaid would normally be preferable. This preference persists for the remainder of the conversation unless the user clearly reverses it (e.g. \"mermaid is fine again\"). When the preference is active, translate any diagram request — including flowcharts, sequence diagrams, ER diagrams, etc. — directly to well-formed mxGraphModel XML.\n\nWhen using XML: IMPORTANT — the XML must be well-formed. Do NOT include ANY XML comments (\u003c!-- --\u003e) in the output.\n\n# draw.io XML Reference\n\nDetailed reference for styles, edge routing, containers, layers, tags, metadata, and dark mode. Consult this when generating draw.io XML diagrams.\n\n## Reasoning budget (read this first)\n\nYour job is to declare the **logical structure** of the diagram — what nodes exist, what edges connect them, what labels they carry, what lane/container groups them. The edge router and the optional layout pass (`postLayout: \"elk\"`, see **Edge routing \u0026 layout passes**) handle routing and placement; you do **not** need to do layout math.\n\n**Do NOT** in your reasoning:\n\n- Do NOT debate the topic. The user asked for a flowchart / architecture / sequence / etc. — pick one concrete scenario on your first impulse and commit. Never write \"Actually, let me think of something else…\" or pitch alternatives.\n- Do NOT debate flat-lanes vs nested-pools, horizontal vs vertical orientation, one vs multiple variations. Pick the first reasonable option (almost always: flat swimlanes, top-down or left-right based on what fits the content). Do not flip-flop.\n- Do NOT compute x/y coordinates in prose. No \"column spacings of 160px totaling 1840px width — that's too wide, let me tighten to 1700…\" loops. Use the rigid grid below; do the arithmetic in your head and write the XML.\n- Do NOT re-derive drawio mechanics (`horizontal=0`, `startSize=110`, nested-lane coordinates). Use the templates below as-is.\n- Do NOT enumerate columns (\"customer lane columns 0-10, web app 1-7\"). Place a node, move on.\n- Do NOT add `\u003cArray as=\"points\"\u003e` waypoints. Edges are routed automatically.\n- Do NOT set `exitX` / `exitY` / `entryX` / `entryY` connection-point overrides unless you have specific geometric intent.\n- Do NOT verify, re-check, or adjust coordinates after placing a node.\n- Do NOT narrate \"building the diagram / finalizing the XML / now let me…\". Just emit XML.\n- Do NOT write out lists of node positions as planning text. Emit them as `\u003cmxCell\u003e` elements directly.\n\n**Do** in your reasoning:\n\n- Identify the diagram type + actors/stages (1-2 short sentences).\n- Identify any grouping (swimlanes? containers? none?).\n- Go straight to XML.\n\n**Rigid grid — use for every XML diagram:**\n\n- Column x = `col_index * 180 + 40`  (col 0 = 40, col 1 = 220, col 2 = 400, …)\n- Row y = `row_index * 120 + 40`     (row 0 = 40, row 1 = 160, row 2 = 280, …)\n- Node size: rectangles `140×60`, diamonds `140×80`, circles `60×60`, documents `120×80`, cylinders `100×70`\n\nPick a `(col, row)` for each node. Don't think about centers or exact gaps — the grid already spaces nodes apart, and slight misalignment is invisible in the result.\n\n**Give every node its own `(col, row)` cell.** Two nodes in the same cell land on top of each other. With `postLayout: \"elk\"` the positions are only a rough starting direction (ELK re-places everything); without it they are the final positions, so the cell you pick is what the user sees.\n\n## General principles\n\n- **Use proper draw.io shapes and connectors** — choose the semantically correct shape for each element (e.g., `shape=cylinder3` for databases and tanks, `rhombus` for decisions, `shape=mxgraph.pid2valves.*` for valves in P\u0026IDs). draw.io has extensive shape libraries; prefer domain-appropriate shapes over generic rectangles.\n- **Decide whether to search for shapes** — before generating a diagram, decide if it needs domain-specific shapes from draw.io's extended libraries. **Skip `search_shapes`** for standard diagram types that use basic geometric shapes: flowcharts, UML (class, sequence, state, activity), ERD, org charts, mind maps, Venn diagrams, timelines, wireframes, and any diagram using only rectangles, diamonds, circles, cylinders, and arrows. Also skip if the user explicitly asks to use basic/simple shapes or says not to search. **Use `search_shapes`** when the diagram requires industry-specific or branded icons: cloud architecture (AWS, Azure, GCP), network topology (Cisco, rack equipment), P\u0026ID (valves, instruments, vessels), electrical/circuit diagrams, Kubernetes, BPMN with specific task types, or any domain where the user expects realistic/standardized symbols rather than labeled boxes. It also finds brand/product logos and general-purpose pictorial icons (e.g. `react`, `slack`, `shopping cart`, `solar panel`) — returned as ready-to-use `shape=image` styles — so use it too when the user asks for logos or everyday concept icons.\n- **Match the language of labels to the user's language** — if the user writes in German, French, Japanese, etc., all diagram labels, titles, and annotations should be in that same language.\n- **Group related nodes, and surface a hub when edges converge** — put nodes that belong together inside a container or swimlane, and keep external actors (users, files, third-party systems) outside implementation containers. When many edges converge on one area or cross several groups, route them through a single hub/gateway node (a registry, broker, event log, …) instead of drawing every low-level dependency across the canvas — fewer crossings, clearer contract.\n- **Encode secondary detail in node text, not edges** — draw an edge only when the relationship itself carries meaning; push incidental detail into the node label so the connector layer stays readable.\n- **File each edge at the innermost container holding BOTH endpoints** — `parent=\"\u003ccontainer_id\u003e\"` when both ends sit in the same container (at any nesting depth), `parent=\"1\"` when one end is outside all containers. Auto-layout reads an edge's coordinates in its parent's frame, so an edge parked further out than its endpoints is laid out in the wrong place. Details under [Nested architecture containers](#nested-architecture-containers-cloud-infra-network-topologies).\n\n## Common styles\n\n**Rounded rectangle:**\n```xml\n\u003cmxCell id=\"2\" value=\"Label\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n  \u003cmxGeometry x=\"100\" y=\"100\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\n**Diamond (decision):**\n```xml\n\u003cmxCell id=\"3\" value=\"Condition?\" style=\"rhombus;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n  \u003cmxGeometry x=\"100\" y=\"200\" width=\"120\" height=\"80\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\n**Arrow (edge):**\n```xml\n\u003cmxCell id=\"4\" value=\"\" style=\"edgeStyle=orthogonalEdgeStyle;html=1;\" edge=\"1\" source=\"2\" target=\"3\" parent=\"1\"\u003e\n  \u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\n**Labeled arrow:**\n```xml\n\u003cmxCell id=\"5\" value=\"Yes\" style=\"edgeStyle=orthogonalEdgeStyle;html=1;\" edge=\"1\" source=\"3\" target=\"6\" parent=\"1\"\u003e\n  \u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\n## Style properties\n\n| Property | Values | Use for |\n|----------|--------|---------|\n| `rounded=1` | 0 or 1 | Rounded corners |\n| `whiteSpace=wrap` | wrap | Text wrapping |\n| `fillColor=#dae8fc` | Hex color | Background color |\n| `strokeColor=#6c8ebf` | Hex color | Border color |\n| `fontColor=#333333` | Hex color | Text color |\n| `shape=cylinder3` | shape name | Database cylinders |\n| `shape=mxgraph.flowchart.document` | shape name | Document shapes |\n| `ellipse` | style keyword | Circles/ovals |\n| `rhombus` | style keyword | Diamonds |\n| `edgeStyle=orthogonalEdgeStyle` | style keyword | Right-angle connectors |\n| `edgeStyle=elbowEdgeStyle` | style keyword | Elbow connectors |\n| `dashed=1` | 0 or 1 | Dashed lines |\n| `swimlane` | style keyword | Swimlane containers |\n| `group` | style keyword | Invisible container (pointerEvents=0) |\n| `container=1` | 0 or 1 | Enable container behavior on any shape |\n| `pointerEvents=0` | 0 or 1 | Prevent container from capturing child connections |\n| `html=1` | 0 or 1 | Enable HTML rendering in labels (required for `\u003cb\u003e`, `\u003cbr\u003e`, `\u003cfont\u003e`, etc.) |\n| `shape=umlLifeline;perimeter=lifelinePerimeter;size=16` | shape | UML sequence diagram lifeline (size = header height) |\n\n## HTML labels\n\n**Always include `html=1` in the style** when the `value` attribute contains any HTML tags (`\u003cb\u003e`, `\u003cbr\u003e`, `\u003cfont\u003e`, `\u003ci\u003e`, `\u003cu\u003e`, `\u003chr\u003e`, `\u003cp\u003e`, `\u003ctable\u003e`, etc.). Without `html=1`, HTML tags are displayed as literal text instead of being rendered.\n\nHTML in attribute values must be **XML-escaped**: `\u003c` → `\u0026lt;`, `\u003e` → `\u0026gt;`, `\u0026` → `\u0026amp;`, `\"` → `\u0026quot;`\n\n```xml\n\u003cmxCell value=\"\u0026lt;b\u0026gt;Title\u0026lt;/b\u0026gt;\u0026lt;br\u0026gt;Description\"\n        style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n  \u003cmxGeometry x=\"100\" y=\"100\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\n**Line breaks:** Use `\u0026#xa;` (works with both `html=1` and `html=0`) or `\u0026lt;br\u0026gt;` (requires `html=1`) for line breaks — never use `\\n`, which renders as literal backslash-n text instead of a newline.\n\n**Best practice:** Always include `html=1` in every cell style. This ensures labels render correctly whether they contain HTML or plain text — plain text is unaffected by the flag.\n\n**Bold/italic/underline:** Use `fontStyle` in the style string when the entire label should be bold (`fontStyle=1`), italic (`fontStyle=2`), or underline (`fontStyle=4`). Values can be combined via bitwise OR (e.g., `fontStyle=3` = bold+italic). Use HTML tags (`\u003cb\u003e`, `\u003ci\u003e`, `\u003cu\u003e`) only when formatting part of the label (e.g., bold title with normal description). Never combine `fontStyle` with HTML tags for the same effect — this is redundant and causes visible raw tags if `html=1` is missing.\n\n## Edges\n\n**CRITICAL: Every edge `mxCell` must contain a `\u003cmxGeometry relative=\"1\" as=\"geometry\" /\u003e` child element.** Self-closing edge cells (e.g. `\u003cmxCell ... edge=\"1\" ... /\u003e`) are invalid and will not render correctly. Always use the expanded form:\n```xml\n\u003cmxCell id=\"e1\" edge=\"1\" parent=\"1\" source=\"a\" target=\"b\" style=\"...\"\u003e\n  \u003cmxGeometry relative=\"1\" as=\"geometry\" /\u003e\n\u003c/mxCell\u003e\n```\n\n**Don't hand-route edges.** Just declare `source` and `target`. You do **not** need to:\n- Add `\u003cmxPoint\u003e` waypoints\n- Set `exitX` / `exitY` / `entryX` / `entryY`\n- Route around obstacles\n- Worry about edge-vertex collisions or parallel edge spacing\n\ndraw.io's built-in router is **basic**: it draws each edge as a straight line or a simple right-angle path between `source` and `target`, with **no awareness of other shapes** — a wire will run straight across any box that sits between its endpoints. That's fine when connected nodes have open space between them. When edges would otherwise cross over shapes, or you want consistently clean orthogonal wires that route *around* the boxes, set **`routing: \"libavoid\"`**; for a full re-layout use **`postLayout: \"elk\"`** (see **Edge routing \u0026 layout passes** below). Both compute the waypoints for you — you never add them by hand either way.\n\n**What you still choose: the edge style.** The style determines the overall look (orthogonal angles, curves, straight lines) — the router honors the style family.\n\n| Style | Syntax | Best for |\n|-------|--------|---------|\n| **Orthogonal** | `edgeStyle=orthogonalEdgeStyle` | Flowcharts, architecture, network diagrams, BPMN — any diagram with right-angle connectors |\n| **Straight** | no `edgeStyle` | UML class/sequence diagrams, direct point-to-point connections. For sequence diagram messages use `endSize=6;startSize=6;` to keep arrowheads small |\n| **Entity Relation** | `edgeStyle=entityRelationEdgeStyle` | ER diagrams — creates perpendicular stubs at both ends |\n| **Curved** | `curved=1` | Mind maps, informal diagrams |\n| **Elbow** | `edgeStyle=elbowEdgeStyle;elbow=vertical;` | Rarely needed — `orthogonalEdgeStyle` handles almost all cases; use this only for simple 1-bend linear flows |\n\n**Use a consistent edge style within each diagram.** Pick one based on diagram type and apply it to all edges: ER → `entityRelationEdgeStyle`; UML class → straight; mind maps → curved; flowcharts/architecture/network → `orthogonalEdgeStyle`.\n\n**Useful edge style attributes** that apply regardless of routing:\n- `rounded=1` — rounded corners at bend points (recommended for orthogonal)\n- `endArrow=classic` / `endArrow=none` — arrow heads\n- `dashed=1` — dashed line\n- `strokeColor=#...`, `strokeWidth=2` — color/width\n- Edge labels: set `value` directly on the edge cell\n\n**Keep edge labels short and meaningful** — one to three words (`Yes`, `async`, `reads`). Drop labels that merely restate an obvious action (`call`, `register`); move longer explanations into node text or a small legend node.\n\n**Visual semantics — stay consistent, add a legend when mixing styles.** Within one diagram apply `dashed=1`, `strokeColor`, and `strokeWidth` consistently for one chosen meaning (e.g. dashed = optional / async / inferred relationship). Don't mix several dashed meanings without a small legend explaining them.\n\n## Containers and groups\n\nFor architecture diagrams or any diagram with nested elements, use draw.io's proper parent-child containment — do **not** just place shapes on top of larger shapes.\n\n### How containment works\n\nSet `parent=\"containerId\"` on child cells. Children use **relative coordinates** within the container.\n\n### Container types\n\n| Type | Style | When to use |\n|------|-------|-------------|\n| **Group** (invisible) | `group;` | No visual border needed, container has no connections. Includes `pointerEvents=0` so child connections are not captured |\n| **Swimlane** (titled) | `swimlane;startSize=30;` | Container needs a visible title bar/header, or the container itself has connections |\n| **Custom container** | Add `container=1;pointerEvents=0;` to any shape style | Any shape acting as a container without its own connections |\n\n### Key rules\n\n- **Edges to children inside containers naturally cross the container boundary** — this is correct and expected. Do not add extra waypoints or complex routing to avoid a parent container when connecting to shapes inside it.\n- **Always add `pointerEvents=0;`** to container styles that should not capture connections being rewired between children\n- Only omit `pointerEvents=0` when the container itself needs to be connectable — in that case, use `swimlane` style which handles this correctly (the client area is transparent for mouse events while the header remains connectable)\n- Children must set `parent=\"containerId\"` and use coordinates **relative to the container**\n\n### Example: Architecture container with swimlane\n\n```xml\n\u003cmxCell id=\"svc1\" value=\"User Service\" style=\"swimlane;startSize=30;fillColor=#dae8fc;strokeColor=#6c8ebf;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n  \u003cmxGeometry x=\"100\" y=\"100\" width=\"300\" height=\"200\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"api1\" value=\"REST API\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"svc1\"\u003e\n  \u003cmxGeometry x=\"20\" y=\"40\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"db1\" value=\"Database\" style=\"shape=cylinder3;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"svc1\"\u003e\n  \u003cmxGeometry x=\"160\" y=\"40\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\n### Example: Invisible group container\n\n```xml\n\u003cmxCell id=\"grp1\" value=\"\" style=\"group;\" vertex=\"1\" parent=\"1\"\u003e\n  \u003cmxGeometry x=\"100\" y=\"100\" width=\"300\" height=\"200\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"c1\" value=\"Component A\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"grp1\"\u003e\n  \u003cmxGeometry x=\"10\" y=\"10\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\n### Swimlanes for grouped actors (BPMN-style flowcharts)\n\nUse **flat swimlanes** at `parent=\"1\"`, stacked vertically. One row of nodes per lane.\n\n**Fixed values — do not compute or debate:**\n- Lane size: `x=0, y=lane_index*150, width=CANVAS_W, height=150`\n- Lane style: `swimlane;horizontal=0;startSize=110;fillColor=\u003cpastel\u003e;html=1;`\n- Child nodes inside a lane: `parent=\"\u003clane_id\u003e\"`, `x = 120 + col*180`, `y = 45` (always 45), size 140×60 (or 140×80 for diamonds)\n- Cross-lane edges: `parent=\"1\"` (not inside a lane)\n\nPick `CANVAS_W = max_col * 180 + 300`. Choose lane colors from `#f5f5f5, #e8f4f8, #fff0e6, #e8f5e9, #fff9e6, #fce4ec` in that order.\n\n```xml\n\u003cmxCell id=\"lane1\" value=\"Customer\" style=\"swimlane;horizontal=0;startSize=110;fillColor=#f5f5f5;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n  \u003cmxGeometry x=\"0\" y=\"0\" width=\"1800\" height=\"150\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"n1\" value=\"Place Order\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"lane1\"\u003e\n  \u003cmxGeometry x=\"120\" y=\"45\" width=\"140\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"lane2\" value=\"System\" style=\"swimlane;horizontal=0;startSize=110;fillColor=#e8f4f8;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n  \u003cmxGeometry x=\"0\" y=\"150\" width=\"1800\" height=\"150\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"n2\" value=\"Validate\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"lane2\"\u003e\n  \u003cmxGeometry x=\"300\" y=\"45\" width=\"140\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"e1\" edge=\"1\" parent=\"1\" source=\"n1\" target=\"n2\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;\"\u003e\n  \u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\nDo NOT nest lanes inside a pool. Do NOT vary lane heights. Do NOT compute title-area offset — it is always 110, children start at x=120 to clear it.\n\n### Nested architecture containers (cloud, infra, network topologies)\n\nFor diagrams with **nested groupings** — VPC → Availability Zone → EC2 instance, Datacenter → Rack → Server, Region → Environment → Service — use nested swimlanes. This is where the AI most often flattens hierarchy that should be nested. Treat each level as a swimlane container.\n\n**Rules:**\n- Every container is a `swimlane` with `startSize=24` (title area at the top).\n- Child cells set `parent=\"\u003ccontainer_id\u003e\"` and use coordinates **relative to their parent** (origin 0,0 is the parent's top-left, below the title).\n- **An edge belongs to the innermost container that holds BOTH of its endpoints.** Walk up from both ends until you reach a container that contains both: two cells in the same subnet → that subnet; a web tier and a database tier inside one region → that region; anything with one endpoint outside all containers → `parent=\"1\"`, the layer. This is the rule the draw.io editor's own model maintains, and auto-layout reads an edge's coordinates in its parent's frame, so an edge filed too far out lands in the wrong place.\n- For industry-specific icons (AWS/Azure/GCP logos, Cisco equipment, etc.), call `search_shapes` to get the exact `style` string and substitute it into a regular vertex — the container structure stays the same.\n\n```xml\n\u003cmxCell id=\"vpc\" value=\"VPC\" style=\"swimlane;startSize=24;fillColor=#dae8fc;strokeColor=#6c8ebf;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n  \u003cmxGeometry x=\"0\" y=\"0\" width=\"720\" height=\"360\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"az1\" value=\"AZ us-east-1a\" style=\"swimlane;startSize=24;fillColor=#fff2cc;strokeColor=#d6b656;html=1;\" vertex=\"1\" parent=\"vpc\"\u003e\n  \u003cmxGeometry x=\"20\" y=\"36\" width=\"320\" height=\"300\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"web1\" value=\"web-1\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"az1\"\u003e\n  \u003cmxGeometry x=\"30\" y=\"40\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"db1\" value=\"db-1\" style=\"shape=cylinder3;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"az1\"\u003e\n  \u003cmxGeometry x=\"180\" y=\"40\" width=\"100\" height=\"70\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"az2\" value=\"AZ us-east-1b\" style=\"swimlane;startSize=24;fillColor=#fff2cc;strokeColor=#d6b656;html=1;\" vertex=\"1\" parent=\"vpc\"\u003e\n  \u003cmxGeometry x=\"360\" y=\"36\" width=\"340\" height=\"300\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"web2\" value=\"web-2\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"az2\"\u003e\n  \u003cmxGeometry x=\"30\" y=\"40\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"e1\" edge=\"1\" parent=\"1\" source=\"web1\" target=\"web2\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;\"\u003e\n  \u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\n### Cross-functional flowcharts (actor × phase grid, as a table)\n\nCross-functional flowcharts show a process across **two axes at once** — actors (rows) and phases (columns). Use drawio's `table` shape, which auto-arranges cells into a grid via `childLayout=tableLayout`. This is the canonical draw.io pattern and is distinct from plain swimlanes (which only group on one axis).\n\n**Structure:**\n- Outer container: `shape=table;childLayout=tableLayout;startSize=0;collapsible=0;fillColor=none;`\n- Rows are children of the table: `shape=tableRow;horizontal=0;startSize=0;collapsible=0;`\n- Cells are children of rows — regular vertices, one per (actor, phase) intersection\n- Row heights and cell widths are set via `mxGeometry`; they tile automatically\n- First row = phase headers; first cell of every other row = actor label\n- Process nodes go INSIDE the appropriate cell (parent = cell id) at coordinates relative to the cell\n- Cross-cell edges must use `parent=\"1\"` (same rule as containers)\n\n```xml\n\u003cmxCell id=\"tbl\" style=\"shape=table;childLayout=tableLayout;startSize=0;collapsible=0;fillColor=none;\" vertex=\"1\" parent=\"1\"\u003e\n  \u003cmxGeometry x=\"0\" y=\"0\" width=\"900\" height=\"320\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"r0\" style=\"shape=tableRow;horizontal=0;startSize=0;collapsible=0;\" vertex=\"1\" parent=\"tbl\"\u003e\n  \u003cmxGeometry width=\"900\" height=\"40\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"h0\" style=\"text;html=1;\" vertex=\"1\" parent=\"r0\"\u003e\n  \u003cmxGeometry width=\"140\" height=\"40\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"h1\" value=\"Order\" style=\"text;align=center;fontStyle=1;fillColor=#e8e8e8;\" vertex=\"1\" parent=\"r0\"\u003e\n  \u003cmxGeometry x=\"140\" width=\"380\" height=\"40\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"h2\" value=\"Fulfill\" style=\"text;align=center;fontStyle=1;fillColor=#e8e8e8;\" vertex=\"1\" parent=\"r0\"\u003e\n  \u003cmxGeometry x=\"520\" width=\"380\" height=\"40\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"r1\" style=\"shape=tableRow;horizontal=0;startSize=0;collapsible=0;\" vertex=\"1\" parent=\"tbl\"\u003e\n  \u003cmxGeometry y=\"40\" width=\"900\" height=\"140\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"a1\" value=\"Customer\" style=\"fillColor=#dae8fc;fontStyle=1;\" vertex=\"1\" parent=\"r1\"\u003e\n  \u003cmxGeometry width=\"140\" height=\"140\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"c_cust_order\" style=\"fillColor=none;\" vertex=\"1\" parent=\"r1\"\u003e\n  \u003cmxGeometry x=\"140\" width=\"380\" height=\"140\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"t_place\" value=\"Place Order\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"c_cust_order\"\u003e\n  \u003cmxGeometry x=\"120\" y=\"40\" width=\"140\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"c_cust_fulfill\" style=\"fillColor=none;\" vertex=\"1\" parent=\"r1\"\u003e\n  \u003cmxGeometry x=\"520\" width=\"380\" height=\"140\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"r2\" style=\"shape=tableRow;horizontal=0;startSize=0;collapsible=0;\" vertex=\"1\" parent=\"tbl\"\u003e\n  \u003cmxGeometry y=\"180\" width=\"900\" height=\"140\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"a2\" value=\"System\" style=\"fillColor=#d5e8d4;fontStyle=1;\" vertex=\"1\" parent=\"r2\"\u003e\n  \u003cmxGeometry width=\"140\" height=\"140\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"c_sys_order\" style=\"fillColor=none;\" vertex=\"1\" parent=\"r2\"\u003e\n  \u003cmxGeometry x=\"140\" width=\"380\" height=\"140\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"t_validate\" value=\"Validate\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"c_sys_order\"\u003e\n  \u003cmxGeometry x=\"120\" y=\"40\" width=\"140\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"c_sys_fulfill\" style=\"fillColor=none;\" vertex=\"1\" parent=\"r2\"\u003e\n  \u003cmxGeometry x=\"520\" width=\"380\" height=\"140\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"t_ship\" value=\"Ship\" style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"c_sys_fulfill\"\u003e\n  \u003cmxGeometry x=\"120\" y=\"40\" width=\"140\" height=\"60\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"e1\" edge=\"1\" parent=\"1\" source=\"t_place\" target=\"t_validate\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;\"\u003e\n  \u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n\u003cmxCell id=\"e2\" edge=\"1\" parent=\"1\" source=\"t_validate\" target=\"t_ship\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;\"\u003e\n  \u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\n\u003c/mxCell\u003e\n```\n\n**When to use cross-functional tables vs flat swimlanes:**\n- Flat swimlanes — one-dimensional (actors only, or phases only). Simpler. Use this when you just need to show who does what in sequence.\n- Cross-functional table — two-dimensional (actors AND phases). Use this when **both** the actor and the process stage matter, and every step belongs to a specific (actor, phase) cell.\n\n**Do NOT** nest swimlanes inside a table row, do NOT set `startSize` on rows or cells (columns tile from `x=0`), and do NOT rely on the AI to produce exact widths that sum to the table width — close-enough totals are fine, the `tableLayout` normalizes them.\n\n## Layers\n\nLayers control visibility and z-order. Every cell belongs to exactly one layer. Use layers to manage diagram complexity — viewers can toggle layer visibility to show or hide groups of elements (e.g., \"Physical Infrastructure\" vs \"Logical Network\" vs \"Security Zones\").\n\nCell `id=\"0\"` is the root and cell `id=\"1\"` is the default layer — both always exist. Additional layers are `mxCell` elements with `parent=\"0\"`:\n\n```xml\n\u003cmxGraphModel\u003e\n  \u003croot\u003e\n    \u003cmxCell id=\"0\"/\u003e\n    \u003cmxCell id=\"1\" parent=\"0\"/\u003e\n    \u003cmxCell id=\"2\" value=\"Annotations\" parent=\"0\"/\u003e\n    \u003cmxCell id=\"10\" value=\"Server\" style=\"rounded=1;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n      \u003cmxGeometry x=\"100\" y=\"100\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n    \u003c/mxCell\u003e\n    \u003cmxCell id=\"20\" value=\"Note: deprecated\" style=\"text;\" vertex=\"1\" parent=\"2\"\u003e\n      \u003cmxGeometry x=\"100\" y=\"170\" width=\"120\" height=\"30\" as=\"geometry\"/\u003e\n    \u003c/mxCell\u003e\n  \u003c/root\u003e\n\u003c/mxGraphModel\u003e\n```\n\n- A layer is an `mxCell` with `parent=\"0\"` and no `vertex` or `edge` attribute\n- Assign shapes to a layer by setting `parent` to the layer's id\n- Later layers render on top of earlier layers (higher z-order)\n- Add `visible=\"0\"` as an attribute on the layer cell to hide it by default\n- Use layers when the diagram has distinct conceptual groupings that viewers may want to toggle independently\n\n## Tags\n\nTags are visual filters that let viewers show or hide elements by category. Unlike layers, a single element can have multiple tags, making tags ideal for cross-cutting concerns (e.g., tagging shapes as \"critical\", \"v2\", or \"backend\").\n\nTags require wrapping `mxCell` in an `\u003cobject\u003e` element. Tags are assigned via the `tags` attribute as a space-separated string:\n\n```xml\n\u003cmxGraphModel\u003e\n  \u003croot\u003e\n    \u003cmxCell id=\"0\"/\u003e\n    \u003cmxCell id=\"1\" parent=\"0\"/\u003e\n    \u003cobject id=\"2\" label=\"Auth Service\" tags=\"critical v2\"\u003e\n      \u003cmxCell style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n        \u003cmxGeometry x=\"100\" y=\"100\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n      \u003c/mxCell\u003e\n    \u003c/object\u003e\n    \u003cobject id=\"3\" label=\"Legacy API\" tags=\"critical deprecated\"\u003e\n      \u003cmxCell style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n        \u003cmxGeometry x=\"300\" y=\"100\" width=\"120\" height=\"60\" as=\"geometry\"/\u003e\n      \u003c/mxCell\u003e\n    \u003c/object\u003e\n  \u003c/root\u003e\n\u003c/mxGraphModel\u003e\n```\n\n- Tags require the `\u003cobject\u003e` wrapper — a plain `mxCell` cannot have tags\n- The `label` attribute on `\u003cobject\u003e` replaces `value` on `mxCell`\n- Tags are space-separated in the `tags` attribute\n- Viewers filter the diagram by selecting tags in the draw.io UI (Edit \u003e Tags)\n- Tags do not affect z-order or structural grouping — they are purely a visibility filter\n\n## Metadata and placeholders\n\nMetadata stores custom key-value properties on shapes as additional attributes on the `\u003cobject\u003e` wrapper element. Combined with placeholders, metadata values can be displayed in labels — useful for data-driven diagrams showing status, owner, IP addresses, or versions on each shape.\n\nSet `placeholders=\"1\"` on the `\u003cobject\u003e` to enable `%propertyName%` substitution in the `label`:\n\n```xml\n\u003cmxGraphModel\u003e\n  \u003croot\u003e\n    \u003cmxCell id=\"0\"/\u003e\n    \u003cmxCell id=\"1\" parent=\"0\"/\u003e\n    \u003cobject id=\"2\" label=\"\u0026lt;b\u0026gt;%component%\u0026lt;/b\u0026gt;\u0026lt;br\u0026gt;Owner: %owner%\u0026lt;br\u0026gt;Status: %status%\"\n            placeholders=\"1\" component=\"Auth Service\" owner=\"Team Backend\" status=\"Active\"\u003e\n      \u003cmxCell style=\"rounded=1;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"1\"\u003e\n        \u003cmxGeometry x=\"100\" y=\"100\" width=\"160\" height=\"80\" as=\"geometry\"/\u003e\n      \u003c/mxCell\u003e\n    \u003c/object\u003e\n  \u003c/root\u003e\n\u003c/mxGraphModel\u003e\n```\n\n- Custom properties are plain XML attributes on `\u003cobject\u003e` (e.g., `component=\"Auth Service\"`)\n- Set `placeholders=\"1\"` to enable `%key%` substitution in the label and tooltip\n- The label must use `html=1` style when using HTML formatting with placeholders\n- Placeholders resolve by walking up the containment hierarchy: shape attributes first, then parent container, then layer, then root — first match wins\n- Predefined placeholders work without custom properties: `%id%`, `%width%`, `%height%`, `%date%`, `%time%`, `%timestamp%`, `%page%`, `%pagenumber%`, `%pagecount%`, `%filename%`\n- Use `%%` for a literal percent sign in labels\n- Tags, metadata, and placeholders can all be combined on the same `\u003cobject\u003e` element\n- Use metadata when shapes represent data records (servers, services, components) and you want to attach structured information beyond the visible label\n\n## Dark mode colors\n\ndraw.io supports automatic dark mode rendering. How colors behave depends on the property:\n\n- **`strokeColor`, `fillColor`, `fontColor`** default to `\"default\"`, which renders as black in light theme and white in dark theme. When no explicit color is set, colors adapt automatically.\n- **Explicit colors** (e.g. `fillColor=#DAE8FC`) specify the light-mode color. The dark-mode color is computed automatically by inverting the RGB values (blending toward the inverse at 93%) and rotating the hue by 180° (via `mxUtils.getInverseColor`).\n- **`light-dark()` function** — To specify both colors explicitly, use `light-dark(lightColor,darkColor)` in the style string, e.g. `fontColor=light-dark(#7EA6E0,#FF0000)`. The first argument is used in light mode, the second in dark mode.\n\nTo enable dark mode color adaptation, the `mxGraphModel` element must include `adaptiveColors=\"auto\"`.\n\nWhen generating diagrams, you generally do not need to specify dark-mode colors — the automatic inversion handles most cases. Use `light-dark()` only when the automatic inverse color is unsatisfactory.\n\n## Edge routing \u0026 layout passes\n\nBy default, edges are drawn by draw.io's **built-in router**, which is intentionally basic: each edge is a straight line or a simple right-angle path between its endpoints, with **no obstacle avoidance** — a connector runs straight through any shape lying between its `source` and `target`. Two **opt-in** passes upgrade this. Set them as fields on the same call that carries the diagram; the result you open, export or copy always reflects the finished pass.\n\n- **`routing: \"libavoid\"`** (XML only) — obstacle-avoiding orthogonal **edge routing**. Vertices stay exactly where you placed them; only the connectors are recomputed, so they run in clean right-angle segments that route *around* the boxes (and spread apart when parallel) instead of cutting across them. Use it for diagrams you laid out deliberately — architecture, network topology, deployment, swimlanes, UML, floor plans — where you want tidy wires without disturbing your layout.\n- **`postLayout: \"elk\"`** — a **full re-layout** (ELK `layered` flow). Vertices move from your positions to canonical hierarchical ones, and the edges are routed as part of that. Node sizes are kept exactly as you declare them, so a label still has to fit the box you gave it. Best for flowcharts, process/state diagrams, decision flows, pipelines, and other directional/hierarchical diagrams. (You should rarely hand-write these as XML — prefer Mermaid.) Flow **direction**: on XML set the optional `direction` field (`\"vertical\"` (default) / `\"horizontal\"`); on Mermaid it is read from the flowchart code (`flowchart TD/TB` vs `LR/RL`) and `direction` is ignored.\n\nThe four combinations:\n\n| `postLayout` | `routing` | Result |\n|---|---|---|\n| — | — | basic built-in router (straight / simple right-angle, no obstacle avoidance); your positions kept |\n| — | `libavoid` | your positions kept; wires re-routed orthogonally *around* the shapes |\n| `elk` | — | ELK places the vertices **and** routes the edges (decent routing built in) |\n| `elk` | `libavoid` | rarely worth it — ELK already routes; only add `libavoid` if ELK's routing specifically comes out poor |\n\n**Pick ONE — they are essentially alternatives, not a stack:**\n- **Neither** — fine when connected nodes sit in clear rows/columns with open space between them, so the basic router's straight/right-angle lines won't cross another shape. Simplest and lightest; do this by default for sparse layouts.\n- **`routing: \"libavoid\"`** — keep your hand-placed layout but clean up the wires: use whenever an edge would otherwise cut across a box, or you want consistently clean orthogonal wires routed around shapes (architecture, network topology, deployment, UML, floor plans — anything densely connected).\n- **`postLayout: \"elk\"`** — when you want a canonical re-layout (vertices moved). ELK routes the edges itself as part of the layout, so **do not also set `routing`** — the combination is redundant in almost all cases. Add `direction: \"horizontal\"` for left-to-right flow.\n\n**When you are passing Mermaid instead of XML: see the `postLayout` parameter description for when to set it.** Complex Mermaid flowcharts (≥ ~20 nodes, ≥ 3 decision diamonds, feedback edges, or ≥ 3 endpoints) need `postLayout: \"elk\"` because the native parser's layout goes cramped or unbalanced past that threshold — the direction follows the flowchart code, so no `direction` is needed. Simple flowcharts and all non-flowchart Mermaid types (sequence, class, ER, sankey, …) need no `postLayout`.\n\n**When NOT to use (XML):**\n- The user has asked for specific positions (swim lanes with exact lanes, architecture diagrams with meaningful spatial arrangement).\n- The diagram relies on containers/grouping where spatial layout encodes information.\n\n## Style reference\n\nComplete style reference (all shape types, style properties, color palettes, HTML labels, and more): https://github.com/jgraph/drawio-mcp/blob/main/shared/style-reference.md\n\nXML Schema (XSD): https://github.com/jgraph/drawio-mcp/blob/main/shared/mxfile.xsd\n\n## CRITICAL: XML well-formedness\n\nWhen generating draw.io XML, the output **must** be well-formed XML:\n- **NEVER include ANY XML comments (`\u003c!-- --\u003e`) in the output.** XML comments are strictly forbidden — they waste tokens, can cause parse errors, and serve no purpose in diagram XML.\n- Escape special characters in attribute values: `\u0026amp;`, `\u0026lt;`, `\u0026gt;`, `\u0026quot;`\n- Always use unique `id` values for each `mxCell`\n\n\n---\n\n# Mermaid Reference\n\nShort hints for generating Mermaid diagrams that render correctly in draw.io. draw.io's Mermaid parser covers 28 diagram types — the header keyword on the first non-directive line selects the type.\n\n_Canonical list \u0026 dialog/ELK docs: \u003chttps://github.com/jgraph/drawio/discussions/5643\u003e._\n\n## General rules\n\n- **Pick the type keyword carefully.** `graph`/`flowchart`, `classDiagram`, `stateDiagram-v2`, `erDiagram`, `sequenceDiagram`, `gitGraph`, `journey`, `pie`, `gantt`, `mindmap`, `timeline`, `quadrantChart`, `requirementDiagram`, `sankey-beta`, `xychart-beta`, `block-beta`, `c4Context`/`C4Container`/`C4Component`, `architecture-beta`, `radar-beta`, `packet-beta`, `venn-beta`, `treemap-beta`, `treeView-beta`, `ishikawa-beta`, `kanban`, `zenuml`, `wardley-beta`, `eventmodeling`. Misspelling the header yields a blank diagram.\n- **No trailing punctuation on node IDs.** IDs are identifiers (`myNode`, `node_1`, `A`) — spaces, hyphens (in some contexts), and reserved words (`end`, `class`, `subgraph`) break the parse. Put display text in brackets or quotes instead: `A[\"User's Account\"]`.\n- **One statement per line.** Separate statements with newlines; `;` works as a delimiter in flowchart but not everywhere.\n- **Quote labels with special characters** (`:`, `-`, parentheses, non-ASCII). Use `\"` not `'`.\n- **HTML in labels:** only `\u003cbr\u003e`, `\u003cb\u003e`, `\u003ci\u003e`, `\u003cu\u003e` are reliable across types. Use `#` for hex colors in styles, never `rgb()`.\n- **Diagrams can take a title block** for some types:\n  ```\n  ---\n  title: My Diagram\n  ---\n  flowchart TD\n  ```\n- **Match the language of labels to the user's language** — if the user writes in German, French, etc., the diagram labels should be in that language too.\n\n## Flowchart (most common)\n\n```\nflowchart TD\n  A[Start] --\u003e B{Decision?}\n  B --\u003e|Yes| C[Do thing]\n  B --\u003e|No| D[Skip]\n  C --\u003e E((End))\n  D --\u003e E\n```\n\n- **Direction:** `TD`/`TB` (top-down), `BT`, `LR`, `RL`.\n- **Node shapes by bracket:** `[rect]`, `(rounded)`, `([stadium])`, `[[subroutine]]`, `[(cylinder)]`, `((circle))`, `{rhombus}`, `{{hexagon}}`, `[/parallelogram/]`, `[\\parallelogram alt\\]`, `[/trapezoid\\]`, `\u003easymmetric]`.\n- **Edges:** `--\u003e` arrow, `---` no arrow, `-.-\u003e` dotted, `==\u003e` thick, `\u003c--\u003e` bidirectional. Inline label: `A -- text --\u003e B` or `A --\u003e|text| B`.\n- **Subgraphs:**\n  ```\n  subgraph Frontend\n    A --\u003e B\n  end\n  ```\n\n### Layout for complex flowcharts\n\ndraw.io's Mermaid parser lays flowcharts out itself, but the result gets cramped or unbalanced once the diagram has any structural complexity. Switch that flowchart to the **ELK layered layout** (the same engine as draw.io's *Arrange ▸ Layout ▸ Vertical/Horizontal Flow*) when ANY of these holds:\n\n- ≥ ~20 nodes, OR\n- ≥ 3 decision diamonds (`{...}`), OR\n- any feedback/back-edge (an edge pointing back to an earlier node — an error path looping to a retry), OR\n- ≥ 3 distinct endpoints.\n\nTwo ways to ask for it, depending on the tool:\n\n- **A `postLayout: \"elk\"` field** on the call, if the tool offers one — use it.\n- **Otherwise select it in the source**, as a YAML frontmatter block at the very top. draw.io honors it wherever it converts Mermaid (editor, opened link, desktop CLI):\n  ```\n  ---\n  config:\n    layout: elk\n  ---\n  flowchart TD\n    A[Start] --\u003e B{Retry?}\n  ```\n  Combines with a `title:` — both are keys of the same frontmatter block.\n\nThe flow direction always follows the flowchart code (`TD`/`TB` vs `LR`/`RL`). **Flowcharts only** — sequence, class, ER, gantt and the rest lay themselves out and ignore the setting. Simple flowcharts (linear chains, \u003c 20 nodes, no branching or back-edges) don't need it either.\n\n### Styling \u0026 colors\n\nThree ways — pick one, don't mix for the same node:\n\n**1. Inline per-node (`style`):**\n```\nflowchart LR\n  A[Start] --\u003e B[End]\n  style A fill:#f9f,stroke:#333,stroke-width:2px,color:#fff\n  style B fill:#bbf,stroke:#f66,stroke-dasharray:5 5\n```\n\n**2. Reusable classes (`classDef` + `:::`):**\n```\nflowchart LR\n  A:::happy --\u003e B:::sad\n  classDef happy fill:#dfd,stroke:#0a0\n  classDef sad fill:#fdd,stroke:#a00\n```\nOr apply to many: `class A,B,C happy`.\n\n**3. Link styling (edges):**\n```\nlinkStyle 0 stroke:#f00,stroke-width:3px\nlinkStyle default stroke:#999\n```\n`0` = first edge in order defined; `default` targets unstyled edges.\n\nStyle properties that work: `fill`, `stroke`, `stroke-width`, `stroke-dasharray`, `color` (font color).\n\n## Sequence diagram\n\n```\nsequenceDiagram\n  participant U as User\n  participant S as Server\n  U-\u003e\u003eS: Request\n  S--\u003e\u003eU: Response\n  Note right of S: Logged\n```\n\n- **Arrows:** `-\u003e` (no head), `-\u003e\u003e` (arrow), `--\u003e\u003e` (dashed), `-x` (X end), `--x` (dashed X).\n- **Activate/deactivate:** `activate S` / `deactivate S` or `S-\u003e\u003e+S2: call` / `S2--\u003e\u003e-S: return`.\n- **Blocks:** `alt/else/end`, `opt/end`, `loop/end`, `par/and/end`, `critical/option/end`.\n- **Notes:** `Note left of A`, `Note over A,B: text`.\n- Optional `autonumber` after header numbers the messages.\n\n## Class diagram\n\n```\nclassDiagram\n  class Animal {\n    +String name\n    +int age\n    +eat() void\n  }\n  class Dog\n  Animal \u003c|-- Dog : inherits\n  Dog \"1\" --\u003e \"*\" Bone : has\n```\n\n- **Relations:** `\u003c|--` inherit, `*--` composition, `o--` aggregation, `--\u003e` association, `..\u003e` dependency, `..|\u003e` realize, `\u003c--\u003e` bidirectional.\n- **Visibility:** `+` public, `-` private, `#` protected, `~` package.\n- **Annotations:** `\u003c\u003cinterface\u003e\u003e`, `\u003c\u003cabstract\u003e\u003e`, `\u003c\u003cenumeration\u003e\u003e` inside the class block or via `Animal \u003c\u003cinterface\u003e\u003e`.\n- **Cardinality:** quoted strings flanking the arrow (`\"1\"`, `\"0..*\"`, `\"*\"`).\n\n## State diagram\n\n```\nstateDiagram-v2\n  [*] --\u003e Idle\n  Idle --\u003e Running : start\n  Running --\u003e Idle : stop\n  Running --\u003e [*]\n  state Running {\n    [*] --\u003e Working\n    Working --\u003e Waiting : block\n    Waiting --\u003e Working : unblock\n  }\n```\n\n- Use `stateDiagram-v2`, not `stateDiagram` (v1 is legacy).\n- `[*]` = start (source) or end (target) depending on direction.\n- `state X { ... }` nests a compound state; `state fork1 \u003c\u003cfork\u003e\u003e`, `\u003c\u003cjoin\u003e\u003e`, `\u003c\u003cchoice\u003e\u003e` mark junction nodes.\n- Transition labels: `A --\u003e B : event [guard] / action`.\n\n## ER diagram\n\n```\nerDiagram\n  CUSTOMER ||--o{ ORDER : places\n  ORDER ||--|{ LINE-ITEM : contains\n  CUSTOMER {\n    string name\n    string email PK\n  }\n```\n\n- **Cardinality symbols:** `|o` zero-or-one, `||` exactly-one, `}o` zero-or-many, `}|` one-or-many. Mirror on both sides (e.g., `||--o{`).\n- Attribute blocks list `type name [PK|FK|UK]` plus optional comment in quotes.\n- Entity names are typically UPPERCASE by convention.\n\n## Journey\n\n```\njourney\n  title Morning routine\n  section Wake up\n    Coffee: 5: Me\n    Read news: 3: Me\n  section Commute\n    Drive: 2: Me, Traffic\n```\n\nEach task: `Name: score(1-5): Actor[, Actor...]`. Section headers group tasks.\n\n## Pie\n\n```\npie showData title Browser share\n  \"Chrome\" : 60\n  \"Firefox\" : 20\n  \"Safari\" : 20\n```\n\n`showData` is optional (renders the numbers). Quotes on labels, colon, numeric value.\n\n## Gantt\n\n```\ngantt\n  title Project timeline\n  dateFormat YYYY-MM-DD\n  section Phase 1\n  Design : a1, 2025-01-01, 7d\n  Build  : after a1, 14d\n  section Phase 2\n  Test   : 2025-01-25, 5d\n```\n\n- `dateFormat` is mandatory.\n- Task line: `Name : [id,] [after id | YYYY-MM-DD], duration[d/w]`.\n- Status tags: `done`, `active`, `crit` before the id (`crit a1`).\n\n## Gitgraph\n\n```\ngitGraph\n  commit\n  branch develop\n  checkout develop\n  commit\n  commit\n  checkout main\n  merge develop\n```\n\nCommands: `commit [id: \"x\"] [tag: \"v1\"]`, `branch name`, `checkout name`, `merge name`, `cherry-pick id: \"x\"`.\n\n## Mindmap\n\n```\nmindmap\n  root((Project))\n    Frontend\n      React\n      CSS\n    Backend\n      Node\n      DB\n```\n\n- Indentation (2-space increments) defines hierarchy.\n- Root shape: `((circle))`, `[rect]`, `(rounded)`, `))cloud((`, `)hexagon(`, `{{hexagon}}`.\n- No edges — they are implied by nesting.\n\n## Timeline\n\n```\ntimeline\n  title Company history\n  section 2020s\n    2021 : Founded\n    2022 : Series A\n         : Launched product\n  section 2030s\n    2030 : IPO\n```\n\nColon separates year/label; multiple `:` lines under one year add sub-events.\n\n## Quadrant chart\n\n```\nquadrantChart\n  title Reach vs Engagement\n  x-axis Low --\u003e High\n  y-axis Low --\u003e High\n  quadrant-1 Stars\n  quadrant-2 Question Marks\n  quadrant-3 Dogs\n  quadrant-4 Cash Cows\n  Campaign A: [0.3, 0.6]\n  Campaign B: [0.75, 0.85]\n```\n\nPoint coords are `[0..1, 0..1]`.\n\n## Requirement diagram\n\n```\nrequirementDiagram\n  requirement req1 {\n    id: \"1\"\n    text: \"The system shall...\"\n    risk: high\n    verifymethod: test\n  }\n  element user_story {\n    type: \"story\"\n  }\n  user_story - satisfies -\u003e req1\n```\n\nRequirement types: `requirement`, `functionalRequirement`, `performanceRequirement`, `interfaceRequirement`, `physicalRequirement`, `designConstraint`. Relations: `contains`, `copies`, `derives`, `satisfies`, `verifies`, `refines`, `traces`.\n\n## Sankey\n\n```\nsankey-beta\nSource,Intermediate,10\nSource,Direct,5\nIntermediate,Sink,10\n```\n\nCSV-style: `source,target,value`. No header. No `title` (use frontmatter).\n\n## XY chart\n\n```\nxychart-beta\n  title \"Revenue\"\n  x-axis [jan, feb, mar, apr]\n  y-axis \"USD\" 0 --\u003e 10000\n  bar [2500, 5000, 7500, 9000]\n  line [3000, 4500, 6500, 8500]\n```\n\n`bar [...]` and `line [...]` can stack; order matters (later overlays earlier).\n\n## Block\n\n```\nblock-beta\n  columns 3\n  A B C\n  D[\"Wide\"]:2 E\n  A --\u003e D\n```\n\n`columns N` sets grid width. `Name:N` spans N columns. Edges use flowchart arrow syntax.\n\n## C4\n\n```\nC4Context\n  Person(user, \"User\")\n  System(app, \"App\", \"Does things\")\n  Rel(user, app, \"Uses\")\n```\n\n- Variants: `C4Context`, `C4Container`, `C4Component`, `C4Dynamic`, `C4Deployment`.\n- Element helpers: `Person`, `System`, `System_Ext`, `Container`, `ComponentDb`, `Boundary(id, \"label\", \"type\")`, etc. Arguments are positional: `(id, label, [type/tech], [description])`.\n- `UpdateElementStyle(tag, $bgColor=\"#…\")` and `AddElementTag` tweak appearance.\n\n## Architecture\n\n```\narchitecture-beta\n  group cloud(cloud)[Cloud]\n  service api(server)[API] in cloud\n  service db(database)[DB] in cloud\n  api:R --\u003e L:db\n```\n\n- Built-in icons: `cloud`, `server`, `database`, `disk`, `internet`. Suffix edge ends with `:T`, `:B`, `:L`, `:R` to pick the side.\n- `group id(icon)[Label]` then `in groupId` on services places nodes.\n\n## Radar\n\n```\nradar-beta\n  title Skills\n  axis js[\"JS\"], py[\"Python\"], go[\"Go\"]\n  curve alice[\"Alice\"]{80, 60, 70}\n  curve bob[\"Bob\"]{50, 90, 65}\n```\n\nAxes and curves are positionally aligned — list values in axis order, 0–100.\n\n## Packet\n\n```\npacket-beta\n  0-15: \"Source Port\"\n  16-31: \"Dest Port\"\n  32-63: \"Seq Number\"\n```\n\n`start-end` (bit ranges) or single-bit `N`. Use a title frontmatter.\n\n## Venn\n\n```\nvenn-beta\n  set A [\"Set A\"]\n  set B [\"Set B\"]\n  union A,B\n  text A [\"only A\"]\n  text A,B [\"shared\"]\n```\n\nDefine every `union` combination whose region you plan to label. `text A,B [...]` places text in intersections.\n\n## Treemap\n\n```\ntreemap-beta\n\"Category\"\n    \"Leaf 1\": 40\n    \"Leaf 2\": 60\n```\n\nNumbers are values (area-weighted). Indent (2+ spaces) for hierarchy.\n\n## Tree view\n\n```\ntreeView-beta\n  \"Root\"\n    \"Child 1\"\n      \"Grandchild\"\n    \"Child 2\"\n```\n\nPure indentation hierarchy, no numbers.\n\n## Ishikawa (fishbone)\n\n```\nishikawa-beta\n  Main Problem\n    Category\n      Cause\n      Sub-cause\n    Another Category\n      Cause\n```\n\nFirst line after header is the problem; top-level indents are categories (Materials, Methods, Machinery, etc. — use whatever makes sense).\n\n## Kanban\n\n```\nkanban\n  todo[To Do]\n    task1[Write spec]@{ assigned: \"Alice\", priority: \"High\" }\n  doing[In progress]\n    task2[Build feature]\n  done[Done]\n```\n\nColumns are `id[Label]` at indent 0; cards are `id[Label]@{ metadata }` inside. Metadata keys: `assigned`, `priority` (`Very Low`/`Low`/`Medium`/`High`/`Very High`), `ticket`.\n\n## ZenUML\n\n```\nzenuml\n  @Actor User\n  @Boundary Web\n  @Control Service\n  User -\u003e Web: request\n  Web -\u003e Service: process()\n  Service -\u003e Web: result\n```\n\nParticipant roles: `@Actor`, `@Boundary`, `@Control`, `@Entity`, `@Database`. Messages use `-\u003e` with a colon-separated label. Supports `if/else`, `while`, `par` blocks like sequence diagrams.\n\n## Wardley map\n\n```\nwardley-beta\n  title Tea Shop\n  anchor Business [0.95, 0.63]\n  component Cup of Tea [0.79, 0.61]\n  component Kettle [0.43, 0.35] (inertia)\n  Business -\u003e Cup of Tea\n  Cup of Tea -\u003e Kettle\n  evolve Kettle 0.62\n```\n\n- Header `wardley` or `wardley-beta`; `title` optional.\n- `anchor`/`component Name [visibility, evolution]` — coords are `[0..1, 0..1]` (y = value-chain visibility, x = evolution from Genesis to Commodity).\n- Component evolution markers in parens: `(inertia)`, `(build)`, `(buy)`, `(outsource)`, `(market)`.\n- Links: `A -\u003e B` dependency, `A +\u003e B` flow. `evolve Name \u003cx\u003e` adds an evolution target; `evolution Genesis -\u003e Custom -\u003e Product -\u003e Commodity` relabels the x-axis stages.\n- Extras: `note \"text\" [x,y]`, `annotation N,[x,y] \"text\"`, `accelerator`/`deaccelerator \"text\" [x,y]`.\n\n## Event Modeling\n\n```\neventmodeling\n  tf 01 ui CartUI\n  tf 02 cmd AddItem\n  tf 03 evt ItemAdded\n  tf 04 rmo Cart\n```\n\n- Each `tf \u003cid\u003e \u003ctype\u003e \u003cName\u003e` is a time-frame (column). Types: `ui` / `pcr` (processor), `cmd` / `command`, `rmo` / `readmodel`, `evt` / `event` — placed on the UI/Automation, Command/Read-Model, and Events swimlanes.\n- Wire frames with `-\u003e\u003e`: `tf 04 evt ItemChanged -\u003e\u003e 02 -\u003e\u003e 03` links frame 04 back to 02 and 03.\n- `Namespace.Name` groups frames into slices (e.g. `Order.ChangeOrder`).\n- `data \u003cid\u003e { ... }` blocks attach payloads, referenced inline with `[[id]]`: `tf 02 cmd AddItem [[AddItem01]]`.\n\n## When to prefer XML over Mermaid\n\n- Precise positions / custom coordinates.\n- draw.io-native shapes (AWS, Azure, GCP, P\u0026ID, Cisco, electrical).\n- Mixed shape libraries or complex multi-layer diagrams.\n- Anything that needs exact colors per element with many variations — Mermaid's styling works but at scale XML is easier to reason about.\n\nDefault to Mermaid for the standard types above; reach for XML only when Mermaid's syntax clearly can't express what's needed.\n",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "additionalProperties": false,
                  "properties": {
                    "direction": {
                      "description": "**XML only** — the flow direction for `postLayout: \"elk\"` on XML diagrams: `vertical` (top-down) or `horizontal` (left-to-right). Defaults to `vertical`. **Ignored for Mermaid**, where direction is read from the flowchart code (`flowchart TD/TB` vs `LR/RL`). Only meaningful together with `postLayout: \"elk\"`.",
                      "enum": [
                        "vertical",
                        "horizontal"
                      ],
                      "type": "string"
                    },
                    "mermaid": {
                      "description": "Mermaid.js diagram definition (e.g. 'graph TD\\n  A--\u003eB'). Supports 26 diagram types — see the tool description for the full list. The diagram is parsed and laid out natively (no upstream mermaid runtime) and converted to draw.io format. Mutually exclusive with 'xml'.",
                      "type": "string"
                    },
                    "postLayout": {
                      "description": "Optional client-side ELK (Eclipse Layout Kernel) layered-flow pass applied after the diagram renders. The only value is `\"elk\"`. Vertices animate (morph) from the positions you supplied to the layered layout — they are **replaced**, so only your edge topology survives. Set it for directional/hierarchical diagrams: flowcharts, process diagrams, state diagrams, decision flows, pipelines, ER/class diagrams with clear parent→child direction. Flow direction (top-down vs left-to-right): for **Mermaid** it is taken from the flowchart code (`flowchart TD/TB` → top-down, `LR/RL` → left-to-right) — do not try to set it here; for **XML** set the optional `direction` field (defaults to top-down).\n**Omit** for diagrams whose layout carries meaning you hand-crafted: swimlanes/pools, containers, architecture / deployment / network topology with grouped regions, P\u0026ID or circuit schematics, floor plans, UML diagrams with deliberate placement.\n\n**For Mermaid flowcharts**, the native parser does its own layout, but it produces cramped or unbalanced output once the diagram has any structural complexity. Request `postLayout: \"elk\"` whenever ANY of the following holds: ≥ ~20 nodes, OR ≥ 3 decision diamonds (`{...}` shapes), OR any feedback/back-edges (an edge that points to an earlier node, e.g. an error path looping back to a retry), OR ≥ 3 distinct endpoints — the flow direction follows the flowchart code, so you never pass `direction` for Mermaid. Skip for simple flowcharts (linear chains, \u003c 20 nodes, no branching/back-edges) and for non-flowchart Mermaid types (sequence, class, ER, sankey, etc. — postLayout doesn't apply).",
                      "enum": [
                        "elk"
                      ],
                      "type": "string"
                    },
                    "routing": {
                      "description": "**XML only** — optional obstacle-avoiding orthogonal **edge-routing** pass (libavoid). The only value is `\"libavoid\"`. Unlike `postLayout`, this does **not** move any vertices — it keeps your hand-placed coordinates and only recomputes each edge's path so wires run in clean right-angle segments that route *around* the boxes instead of cutting through them. Set it for XML diagrams where you have placed nodes deliberately (architecture, network topology, deployment, swimlanes, UML, floor plans) and want tidy connectors without overlaps — exactly the diagrams where you'd OMIT `postLayout`.\ndraw.io's default router is basic (straight or simple right-angle lines with **no obstacle avoidance** — wires cut straight through any box between the endpoints), so reach for `\"libavoid\"` whenever edges would otherwise cross shapes or you want uniformly clean orthogonal wiring on a layout you placed yourself. Think of `routing` and `postLayout` as **alternatives**: use `routing: \"libavoid\"` to keep your positions and only fix the wires, or `postLayout: \"elk\"` to re-lay-out the vertices — and note ELK already routes its edges decently, so when you use `postLayout` you normally should **not** also set `routing` (the combination is redundant in almost all cases). Do not add `\u003cArray as=\"points\"\u003e` waypoints yourself when routing is set; libavoid computes them. **Ignored for Mermaid** (its native/ELK layout already routes).",
                      "enum": [
                        "libavoid"
                      ],
                      "type": "string"
                    },
                    "xml": {
                      "description": "draw.io XML content in mxGraphModel format. Must be well-formed XML: no XML comments (\u003c!-- --\u003e), no unescaped special characters in attribute values. Mutually exclusive with 'mermaid'.",
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                }
              },
              {
                "name": "search_shapes",
                "title": "Search Shapes",
                "description": "Search the draw.io shape library by keywords. Returns matching shapes with their exact style strings, dimensions, and titles. Covers ~10,000 built-in stencils (cloud architecture, network topology, P\u0026ID, electrical, Cisco, Kubernetes, BPMN) and, when those are sparse, supplements results with the draw.io icon service (brand/product logos and general-purpose concept icons, e.g. 'react', 'slack', 'shopping cart', 'solar panel'). Use ONLY for diagrams that need industry-specific, branded, or pictorial icons. Do NOT use for standard diagram types like flowcharts, UML, ERD, org charts, or mind maps — these use basic geometric shapes (rectangles, diamonds, circles, cylinders) that are already covered in the XML reference. Also skip if the user asks to use basic/simple shapes or says not to search. The style string from the results can be used directly in mxCell style attributes.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "additionalProperties": false,
                  "properties": {
                    "limit": {
                      "description": "Maximum number of results to return (default: 10, max: 50)",
                      "type": "number"
                    },
                    "query": {
                      "description": "Space-separated search keywords (e.g. 'pid globe valve', 'aws lambda', 'cisco router', 'kubernetes pod')",
                      "type": "string"
                    }
                  },
                  "required": [
                    "query"
                  ],
                  "type": "object"
                },
                "outputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "additionalProperties": false,
                  "properties": {
                    "shapes": {
                      "description": "Matching shapes, best match first — empty when nothing matched the query.",
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "h": {
                            "description": "Default height in pixels",
                            "type": "number"
                          },
                          "style": {
                            "description": "mxCell style string, usable verbatim in a style attribute",
                            "type": "string"
                          },
                          "title": {
                            "description": "Shape name",
                            "type": "string"
                          },
                          "w": {
                            "description": "Default width in pixels",
                            "type": "number"
                          }
                        },
                        "required": [
                          "style",
                          "w",
                          "h",
                          "title"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    }
                  },
                  "required": [
                    "shapes"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                }
              }
            ],
            "schemaTokens": 16005,
            "changedAt": "2026-09-30T21:56:39.575081811Z",
            "check": {
              "checker": "anchor-check/1.0",
              "totalTokens": 16005,
              "counts": {
                "error": 0,
                "note": 1,
                "warn": 4
              },
              "findings": [
                {
                  "rule": "TC07",
                  "severity": "warn",
                  "tool": "create_diagram",
                  "message": "the description is about 13,720 tokens",
                  "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
                },
                {
                  "rule": "TC18",
                  "severity": "warn",
                  "tool": "create_diagram",
                  "message": "readOnlyHint is true but the name says \"create\"",
                  "fix": "If it changes anything, readOnlyHint must be false."
                },
                {
                  "rule": "TC22",
                  "severity": "warn",
                  "tool": "create_diagram",
                  "message": "the definition is about 16,071 tokens",
                  "fix": "Trim the description and parameter docs, or split the tool."
                },
                {
                  "rule": "TC23",
                  "severity": "warn",
                  "message": "2 tools, about 16,599 tokens of definitions",
                  "fix": "Split the server by job, or offer a smaller default toolset (a read-only set, or a search-then-call pattern)."
                },
                {
                  "rule": "TC24",
                  "severity": "note",
                  "message": "1 of 2 tools have no outputSchema",
                  "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
                }
              ]
            }
          },
          "updatedAt": "2026-10-05T00:15:22.744605032Z"
        }
      },
      {
        "slug": "tldraw",
        "name": "tldraw SDK + MCP",
        "vendor": "tldraw",
        "vendorUrl": "https://tldraw.dev",
        "kind": "sdk",
        "category": "diagramming",
        "summary": "A React infinite-canvas SDK that an agent can drive through the editor API, creating, reading and changing shapes, turning Mermaid into shapes and exporting images.",
        "url": "https://www.anchorterminal.com/tools/tldraw",
        "markdownUrl": "https://www.anchorterminal.com/tools/tldraw.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/tldraw.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/tldraw.json",
        "repo": "https://github.com/tldraw/tldraw",
        "license": "tldraw licence (source-available, production needs a licence key)",
        "transports": [
          "streamable-http",
          "sse"
        ],
        "remoteUrl": "https://tldraw-mcp-app.tldraw.workers.dev/mcp",
        "packages": [
          {
            "registry": "npm",
            "name": "tldraw"
          }
        ],
        "auth": "none",
        "authNotes": "The SDK runs in your app and needs no API key. It checks a public licence key on the client, offline, and won't run in production without one. The hosted MCP App needs no auth.",
        "pricing": "paid",
        "pricingNotes": "Free to use in development. Production needs a licence key. A 100-day trial is free with no card, a hobby licence for non-commercial projects is free at tldraw's discretion and shows a watermark, and commercial licences are annual with value-based pricing agreed with sales. Startup discounts are available. The MCP App is free (https://tldraw.dev/pricing).",
        "priceSummary": "Paid",
        "where": "hosted",
        "x402": {
          "level": "no",
          "endpoints": []
        },
        "toolCount": 6,
        "popularity": {
          "githubStars": 50672,
          "npmWeekly": 490141,
          "pypiWeekly": null,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://tldraw.dev/docs/ai",
        "llmsTxt": "https://tldraw.dev/llms.txt",
        "registryName": "io.github.tldraw/tldraw",
        "capabilities": [
          "diagram.create",
          "diagram.as-code",
          "diagram.edit",
          "diagram.export"
        ],
        "tags": [
          "typescript",
          "hosted",
          "mcp",
          "llms-txt",
          "free-tier"
        ],
        "lastRelease": "2026-09-30",
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 61,
          "grade": "C",
          "agentReady": false,
          "rank": 236,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 2,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 71,
            "maintenance": 89,
            "payments": 35,
            "reliability": 75,
            "schema": 79,
            "security": 40,
            "transparency": 51
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": -2,
          "negativeNotes": [
            "Checked 2026-10-01. The licence page says hobby licences send nothing and trial licences send only a hash of the key, with no user data. The SDK's LicenseManager sends the licence ID, SKU, environment and the full page URL (window.location.href) for trial, hobby-with-watermark and unlicensed production deployments, and the licence key page lists most of this. A full page URL can carry user data in its path or query (https://github.com/tldraw/tldraw/blob/main/packages/editor/src/lib/license/LicenseManager.ts, https://tldraw.dev/community/license)."
          ],
          "verdict": "Full editor API to create, read, bind and export shapes from code, with agent, chat and workflow starter kits. Source-available, and commercial prices aren't published.",
          "strengths": [
            "Full editor API to create, read, bind and export shapes from code, with agent, chat and workflow starter kits",
            "Hosted MCP App with two model-facing tools, all six tools annotated",
            "At least six releases between 15 July and 30 September 2026, with dated release notes",
            "Development use and a 100-day production trial need no payment"
          ],
          "weaknesses": [
            "Source-available, and commercial prices aren't published",
            "`exec` runs model-written JavaScript on the canvas with no approval step",
            "Licence pings send the licence ID and full page URL for trial and hobby keys, more than the licence page says",
            "SECURITY.md lists only 3.x as supported while the current release is 5.5",
            "No server-side REST API, and the MCP App needs a host that renders MCP Apps"
          ],
          "agentNotes": [
            "Through the MCP App, call `search` on the Editor API spec first, then `exec` with JavaScript that calls `editor` methods",
            "Omit `canvasId` to start a blank canvas, and pass the returned `canvasId` to keep editing the same one",
            "Paste Mermaid into the canvas to get editable shapes instead of placing each shape by hand",
            "Return `editor.getCurrentPageShapes()` from `exec` to check what was drawn",
            "Read the release notes before a minor upgrade. Minor versions can break"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 3,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "C",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 61
            }
          ],
          "editorialScores": {
            "ergonomics": 71,
            "maintenance": 89,
            "payments": 35,
            "reliability": 75,
            "schema": 79,
            "security": 40,
            "transparency": 45
          },
          "provenanceScore": 57
        },
        "connect": {
          "install": "npm install tldraw",
          "claudeCode": "claude mcp add --transport http tldraw https://tldraw-mcp-app.tldraw.workers.dev/mcp",
          "config": {
            "mcpServers": {
              "tldraw": {
                "url": "https://tldraw-mcp-app.tldraw.workers.dev/mcp"
              }
            }
          }
        },
        "letme": {
          "capability": "https://letme.dev/diagram.create",
          "tool": "https://letme.dev/tldraw"
        },
        "area": "design-diagrams",
        "provenance": {
          "legalEntity": "tldraw, Inc.",
          "domain": "tldraw.dev",
          "domainRegistered": "2022-04-11",
          "endpointOnVendorDomain": false,
          "terms": "https://www.tldraw.com/tos.html",
          "privacy": "https://www.tldraw.com/privacy.html",
          "statusPage": "",
          "changelog": "https://tldraw.dev/releases",
          "securityTxt": "none",
          "checked": "2026-09-30",
          "notes": [
            "The hosted MCP App runs on a workers.dev subdomain, not on a tldraw domain"
          ],
          "score": 57
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/tldraw.json",
        "live": {
          "slug": "tldraw",
          "probe": {
            "target": "https://tldraw-mcp-app.tldraw.workers.dev/mcp",
            "method": "mcp-initialize",
            "lastAt": "2026-10-05T00:15:31.323249538Z",
            "lastOk": true,
            "lastStatus": 200,
            "lastMs": 807,
            "lastNote": "initialize answered",
            "authRequired": false,
            "uptime24h": 100,
            "uptime30d": 100,
            "p50ms24h": 720,
            "p95ms24h": 1037,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 35
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 276
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 248
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 271
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 272
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "versions": [
            {
              "registry": "github",
              "name": "tldraw/tldraw",
              "version": "v5.5.2",
              "released": "2026-10-02",
              "seenAt": "2026-10-04T16:42:01.6318074Z"
            },
            {
              "registry": "mcp-registry",
              "name": "io.github.tldraw/tldraw",
              "version": "0.1.0",
              "seenAt": "2026-10-04T23:42:40.113054682Z"
            },
            {
              "registry": "npm",
              "name": "tldraw",
              "version": "5.5.2",
              "seenAt": "2026-10-04T16:42:01.416168228Z"
            }
          ],
          "githubStars": 50744,
          "npmWeekly": 504776,
          "securityTxt": {
            "url": "https://tldraw.dev/.well-known/security.txt",
            "state": "none",
            "checkedAt": "2026-10-04T15:15:37.299634459Z"
          },
          "llmsTxt": {
            "url": "https://tldraw.dev/llms.txt",
            "ok": true,
            "status": 200,
            "checkedAt": "2026-10-04T15:18:18.01702441Z"
          },
          "domain": {
            "domain": "tldraw.dev",
            "registered": "2022-04-11",
            "source": "https://pubapi.registry.google/rdap/domain/tldraw.dev",
            "checkedAt": "2026-10-04T13:10:18.060433565Z"
          },
          "pages": [
            {
              "url": "https://tldraw.dev/releases",
              "kind": "changelog",
              "status": 304,
              "checkedAt": "2026-10-04T15:48:32.193004388Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "6de3df0f9614"
            },
            {
              "url": "https://tldraw.dev/pricing",
              "kind": "pricing",
              "status": 200,
              "checkedAt": "2026-10-04T15:48:29.52736445Z",
              "changedAt": "2026-10-04T15:48:29.52736445Z",
              "fingerprint": "fd2314f2ec44"
            },
            {
              "url": "https://www.tldraw.com/privacy.html",
              "kind": "privacy",
              "status": 0,
              "checkedAt": "2026-10-04T15:52:27.828332218Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "blockedByRobots": true
            },
            {
              "url": "https://www.tldraw.com/tos.html",
              "kind": "terms",
              "status": 0,
              "checkedAt": "2026-10-04T15:52:28.018059669Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "blockedByRobots": true
            }
          ],
          "updatedAt": "2026-10-05T00:15:31.323249538Z"
        }
      },
      {
        "slug": "lucid",
        "name": "Lucid API + MCP",
        "vendor": "Lucid Software",
        "vendorUrl": "https://lucid.co",
        "kind": "http-api",
        "category": "diagramming",
        "summary": "REST API and hosted MCP server for creating, reading and managing Lucidchart and Lucidspark diagrams.",
        "url": "https://www.anchorterminal.com/tools/lucid",
        "markdownUrl": "https://www.anchorterminal.com/tools/lucid.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/lucid.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/lucid.json",
        "license": "proprietary",
        "transports": [
          "http",
          "streamable-http"
        ],
        "remoteUrl": "https://api.lucid.co",
        "packages": [],
        "auth": "mixed",
        "authNotes": "API keys (Bearer, with grants such as DocumentEdit) from the developer portal once developer tools are enabled in user settings or an admin assigns the developer role. OAuth 2.0 with scopes such as lucidchart.document.content, which sharing and embed endpoints require. Every call needs a `Lucid-Api-Version` header. The MCP server uses OAuth with dynamic client registration, and account admins can switch it on for the whole account.",
        "pricing": "freemium",
        "pricingNotes": "Free plan with limited editable documents. Individual $9 a month and Team $10 per user a month with a 3-user minimum, billed yearly. Enterprise custom. Lucid doesn't publish API or MCP limits by plan (https://lucid.app/pricing/lucidchart).",
        "priceSummary": "$9 / seat-mo",
        "where": "hosted",
        "x402": {
          "level": "no",
          "evidence": "No payment support in the REST or MCP docs.",
          "endpoints": []
        },
        "toolCount": 9,
        "popularity": {
          "githubStars": null,
          "npmWeekly": null,
          "pypiWeekly": null,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://lucid.readme.io/reference/overview",
        "llmsTxt": "https://lucid.readme.io/llms.txt",
        "registryName": "app.lucid.mcp/lucid",
        "capabilities": [
          "diagram.create",
          "diagram.as-code",
          "diagram.edit",
          "diagram.export",
          "design.files",
          "design.canvas",
          "design.comments"
        ],
        "tags": [
          "hosted",
          "freemium",
          "free-tier",
          "closed-source",
          "mcp",
          "llms-txt",
          "diagram-as-code",
          "async-jobs",
          "enterprise"
        ],
        "lastRelease": "2026-06-15",
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 60.9,
          "grade": "C",
          "agentReady": false,
          "rank": 238,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 3,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 62,
            "maintenance": 33,
            "payments": 25,
            "reliability": 67,
            "schema": 73,
            "security": 80,
            "transparency": 63
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": 0,
          "verdict": "OAuth 2.0 scopes with `:readonly` variants, and audit log endpoints in the REST API. No public changelog for the API or the MCP server.",
          "strengths": [
            "OAuth 2.0 scopes with `:readonly` variants, and audit log endpoints in the REST API",
            "Mermaid in through REST, PlantUML sequence diagrams through MCP, both editable afterwards",
            "Per-operation rate limits in each reference page's OpenAPI fragment, such as 60 a minute on Create Mermaid Diagram",
            "Nine compact MCP tools, listed in the official registry as app.lucid.mcp/lucid at 1.0.0",
            "SOC 2 Type II, ISO 27001, FedRAMP Moderate and a HackerOne bug bounty"
          ],
          "weaknesses": [
            "No public changelog for the API or the MCP server",
            "The status page doesn't monitor the API or the MCP server",
            "No single OpenAPI file and no official REST SDK",
            "Developer tools and MCP depend on user settings or admin approval",
            "No published price for API or MCP use beyond seat plans"
          ],
          "agentNotes": [
            "Always send `Lucid-Api-Version: 1`, or prefix the path with /v1",
            "For flowcharts and sequence diagrams, post Mermaid markup (up to 100,000 characters) instead of building Standard Import JSON",
            "Request `:readonly` scopes when the agent only reads documents",
            "On 429, wait 60 seconds or back off. Create Mermaid Diagram allows 60 calls a minute",
            "Sharing and embed endpoints need an OAuth token. An API key won't work there"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 3,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "C",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 60.9
            }
          ],
          "editorialScores": {
            "ergonomics": 62,
            "maintenance": 33,
            "payments": 25,
            "reliability": 67,
            "schema": 73,
            "security": 80,
            "transparency": 61
          },
          "provenanceScore": 65
        },
        "connect": {
          "http": "curl https://api.lucid.co/users/me/profile -H \"Authorization: Bearer $LUCID_API_KEY\" -H \"Lucid-Api-Version: 1\"",
          "claudeCode": "claude mcp add --transport http lucid https://mcp.lucid.app/mcp",
          "config": {
            "mcpServers": {
              "lucid": {
                "url": "https://mcp.lucid.app/mcp"
              }
            }
          }
        },
        "letme": {
          "capability": "https://letme.dev/diagram.create",
          "tool": "https://letme.dev/lucid"
        },
        "alsoIn": [
          "design"
        ],
        "area": "design-diagrams",
        "unitPrices": [
          {
            "item": "Individual plan",
            "unit": "seat-month",
            "usd": 9,
            "note": "billed yearly"
          },
          {
            "item": "Team plan",
            "unit": "seat-month",
            "usd": 10,
            "note": "billed yearly, 3-user minimum"
          }
        ],
        "provenance": {
          "legalEntity": "Lucid Software Inc.",
          "domain": "lucid.co",
          "domainRegistered": "",
          "domainNote": "The .co registry has no RDAP service we could query, so the registration date is blank. The MCP server runs on lucid.app, Lucid's product domain.",
          "endpointOnVendorDomain": true,
          "terms": "https://lucid.co/tos",
          "privacy": "https://lucid.co/privacy",
          "statusPage": "https://status.lucid.co",
          "changelog": "",
          "securityTxt": "none",
          "checked": "2026-10-01",
          "notes": [
            "The status page has no API or MCP component",
            "security.txt not rechecked on 2026-10-01; none per the 30 September check"
          ],
          "score": 65
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/lucid.json",
        "live": {
          "slug": "lucid",
          "probe": {
            "target": "https://api.lucid.co",
            "method": "get",
            "lastAt": "2026-10-05T00:15:25.934390102Z",
            "lastOk": true,
            "lastStatus": 404,
            "lastMs": 188,
            "authRequired": false,
            "uptime24h": 100,
            "uptime30d": 100,
            "p50ms24h": 199,
            "p95ms24h": 479,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 35
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 276
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 248
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 271
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 272
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "vendorStatus": {
            "page": "https://status.lucid.co",
            "indicator": "none",
            "summary": "All Systems Operational",
            "checkedAt": "2026-10-05T00:11:24.880230715Z"
          },
          "versions": [
            {
              "registry": "mcp-registry",
              "name": "app.lucid.mcp/lucid",
              "version": "1.0.0",
              "seenAt": "2026-10-04T23:42:40.113054682Z"
            }
          ],
          "securityTxt": {
            "url": "https://lucid.co/.well-known/security.txt",
            "state": "none",
            "checkedAt": "2026-10-04T15:15:47.429149689Z"
          },
          "llmsTxt": {
            "url": "https://lucid.readme.io/llms.txt",
            "ok": true,
            "status": 200,
            "checkedAt": "2026-10-04T15:17:57.566091069Z"
          },
          "domain": {
            "domain": "lucid.co",
            "checkedAt": "2026-10-04T13:08:39.466296912Z"
          },
          "pages": [
            {
              "url": "https://lucid.app/pricing/lucidchart",
              "kind": "pricing",
              "status": 200,
              "checkedAt": "2026-10-04T15:45:42.868386873Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "ba6244b9a39a"
            },
            {
              "url": "https://lucid.co/privacy",
              "kind": "privacy",
              "status": 304,
              "checkedAt": "2026-10-04T15:45:45.033679014Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "42182e432bc9"
            },
            {
              "url": "https://lucid.co/tos",
              "kind": "terms",
              "status": 304,
              "checkedAt": "2026-10-04T15:45:47.182091401Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "522f8449b0a1"
            }
          ],
          "updatedAt": "2026-10-05T00:15:25.934390102Z"
        }
      },
      {
        "slug": "structurizr",
        "name": "Structurizr + MCP",
        "vendor": "Structurizr",
        "vendorUrl": "https://structurizr.com",
        "kind": "http-api",
        "category": "diagramming",
        "summary": "Diagram-as-code tool for software architecture using the C4 model.",
        "url": "https://www.anchorterminal.com/tools/structurizr",
        "markdownUrl": "https://www.anchorterminal.com/tools/structurizr.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/structurizr.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/structurizr.json",
        "repo": "https://github.com/structurizr/structurizr",
        "license": "Apache-2.0",
        "transports": [
          "http",
          "streamable-http"
        ],
        "remoteUrl": "https://mcp.structurizr.com/mcp",
        "packages": [],
        "auth": "mixed",
        "authNotes": "The workspace API on a Structurizr server takes a per-workspace key in the X-Authorization header, and listing all workspaces needs the admin API key. Server authentication can be switched off. The hosted MCP at mcp.structurizr.com needs no key.",
        "pricing": "freemium",
        "pricingNotes": "The DSL, local, the playground and the MCP server are free and Apache 2.0. Running the server from the prebuilt binaries needs a yearly licence priced by unique users (people or automated processes) per installation, from £300 a month for 1 to 20 users up to £2,400 a month for over 1,000, billed annually and bought by email, paid by bank transfer or PayPal invoice. 14-day trial licence from trial.structurizr.com. Building the server from source needs no licence. The cloud service took no new sign-ups after 31 December 2025 and shut down on 30 September 2026 (https://docs.structurizr.com/server/pricing).",
        "priceSummary": "$400 / mo",
        "where": "hosted",
        "x402": {
          "level": "no",
          "endpoints": []
        },
        "toolCount": 6,
        "popularity": {
          "githubStars": 419,
          "npmWeekly": null,
          "pypiWeekly": null,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://docs.structurizr.com",
        "openapi": "https://raw.githubusercontent.com/structurizr/structurizr/refs/heads/main/structurizr-json/structurizr.yaml",
        "capabilities": [
          "diagram.create",
          "diagram.as-code",
          "diagram.edit",
          "diagram.export",
          "diagram.architecture"
        ],
        "tags": [
          "open-source",
          "self-hosted",
          "local",
          "hosted",
          "mcp",
          "diagram-as-code",
          "openapi",
          "free-tier"
        ],
        "lastRelease": "2026-09-19",
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 60.2,
          "grade": "C",
          "agentReady": false,
          "rank": 252,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 4,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 55,
            "maintenance": 68,
            "payments": 50,
            "reliability": 73,
            "schema": 61,
            "security": 43,
            "transparency": 80
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": 0,
          "verdict": "One model can generate several C4 architecture views. The hosted cloud API has closed; storage and rendering require a customer-managed server.",
          "strengths": [
            "One text model yields context, container, component, dynamic and deployment views",
            "Free hosted MCP at mcp.structurizr.com validates, parses, inspects and exports DSL with no key",
            "Apache 2.0 code, an OpenAPI 3.0 definition and dated changelogs",
            "Release 2026.09.19 on 19 September 2026, with reported issues fixed within weeks",
            "Nine months' dated notice before the cloud service shut down"
          ],
          "weaknesses": [
            "The hosted cloud API is gone. Storage and rendering need your own server",
            "Prebuilt server binaries need a paid licence counted per unique user, including API clients",
            "The MCP module is labelled experimental, with one-line tool descriptions",
            "Self-hosted MCP server tools take the workspace API key as a tool argument",
            "No security.txt or disclosure policy, and one maintainer wrote every commit since February"
          ],
          "agentNotes": [
            "Call `validate` and then `inspect` on the DSL before pushing a workspace",
            "Use the Mermaid export when the diagram has to render in Markdown without a Structurizr server",
            "Export needs a view key. Parse the DSL first to list the views",
            "Run the `structurizr/mcp` image with only the flags you need, such as `-dsl -server-read`, to keep write and delete tools out of reach",
            "The workspace API returns JSON, never images. PNG and SVG come from the separate export command"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 3,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "C",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 60.2
            }
          ],
          "editorialScores": {
            "ergonomics": 55,
            "maintenance": 68,
            "payments": 50,
            "reliability": 73,
            "schema": 61,
            "security": 43,
            "transparency": 80
          },
          "provenanceScore": 80
        },
        "connect": {
          "http": "curl \"$STRUCTURIZR_URL/api/workspace/1\" -H \"X-Authorization: $STRUCTURIZR_API_KEY\"",
          "claudeCode": "claude mcp add --transport http structurizr https://mcp.structurizr.com/mcp",
          "config": {
            "mcpServers": {
              "structurizr": {
                "url": "https://mcp.structurizr.com/mcp"
              }
            }
          }
        },
        "letme": {
          "capability": "https://letme.dev/diagram.create",
          "tool": "https://letme.dev/structurizr"
        },
        "area": "design-diagrams",
        "unitPrices": [
          {
            "item": "Server licence, 1 to 20 users",
            "unit": "month",
            "usd": 400,
            "note": "£300 a month billed annually, converted at about $1.34 a pound"
          },
          {
            "item": "Server licence, 21 to 50 users",
            "unit": "month",
            "usd": 800,
            "note": "£600 a month billed annually, converted at about $1.34 a pound"
          }
        ],
        "provenance": {
          "legalEntity": "Structurizr Limited",
          "domain": "structurizr.com",
          "domainRegistered": "2013-11-04",
          "endpointOnVendorDomain": true,
          "terms": "https://structurizr.com/terms-and-conditions",
          "privacy": "https://structurizr.com/privacy-policy",
          "statusPage": "",
          "changelog": "https://github.com/structurizr/structurizr/blob/main/changelog-application.md",
          "securityTxt": "none",
          "checked": "2026-10-01",
          "notes": [
            "Structurizr Limited is a private company registered in Jersey, Channel Islands, Jersey Financial Services Commission registry number 303857 (server EULA)",
            "The Pingdom status page linked from structurizr.com monitored the cloud service, which shut down on 30 September 2026, so it isn't listed",
            "Server terms and privacy policy for the licence also live at https://docs.structurizr.com/server/terms-and-conditions and https://docs.structurizr.com/server/privacy-policy"
          ],
          "score": 80
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/structurizr.json",
        "live": {
          "slug": "structurizr",
          "probe": {
            "target": "https://mcp.structurizr.com/mcp",
            "method": "get",
            "lastAt": "2026-10-05T00:15:30.844502252Z",
            "lastOk": true,
            "lastStatus": 405,
            "lastMs": 72,
            "authRequired": false,
            "uptime24h": 100,
            "uptime30d": 100,
            "p50ms24h": 73,
            "p95ms24h": 130,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 35
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 276
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 248
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 271
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 272
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "versions": [
            {
              "registry": "github",
              "name": "structurizr/structurizr",
              "version": "v2026.09.19",
              "released": "2026-09-19",
              "seenAt": "2026-10-04T16:40:53.233176332Z"
            }
          ],
          "githubStars": 430,
          "securityTxt": {
            "url": "https://structurizr.com/.well-known/security.txt",
            "state": "none",
            "checkedAt": "2026-10-04T15:16:01.092085413Z"
          },
          "domain": {
            "domain": "structurizr.com",
            "registered": "2013-11-04",
            "source": "https://rdap.verisign.com/com/v1/domain/structurizr.com",
            "checkedAt": "2026-10-04T13:06:16.957209253Z"
          },
          "pages": [
            {
              "url": "https://raw.githubusercontent.com/structurizr/structurizr/main/changelog-application.md",
              "kind": "changelog",
              "status": 304,
              "checkedAt": "2026-10-04T15:47:53.255452397Z",
              "changedAt": "2026-10-02T15:24:03.368547202Z",
              "fingerprint": "7d7f8d519415"
            },
            {
              "url": "https://docs.structurizr.com/cloud",
              "kind": "deprecations",
              "status": 200,
              "checkedAt": "2026-10-04T15:44:04.126207686Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "f3914c04c843"
            },
            {
              "url": "https://docs.structurizr.com/server/pricing",
              "kind": "pricing",
              "status": 304,
              "checkedAt": "2026-10-04T15:44:06.275958227Z",
              "changedAt": "2026-10-02T15:20:28.925834824Z",
              "fingerprint": "30400863f0dd"
            },
            {
              "url": "https://structurizr.com/privacy-policy",
              "kind": "privacy",
              "status": 404,
              "checkedAt": "2026-10-04T15:48:12.397727012Z",
              "changedAt": "0001-01-01T00:00:00Z"
            },
            {
              "url": "https://structurizr.com/terms-and-conditions",
              "kind": "terms",
              "status": 404,
              "checkedAt": "2026-10-04T15:48:14.526904538Z",
              "changedAt": "0001-01-01T00:00:00Z"
            }
          ],
          "updatedAt": "2026-10-05T00:15:30.844502252Z"
        }
      },
      {
        "slug": "diagrams-so",
        "name": "Diagrams.so API + MCP",
        "vendor": "Diagrams.so (RedHold LLC)",
        "vendorUrl": "https://diagrams.so",
        "kind": "http-api",
        "category": "diagramming",
        "summary": "Turns a plain-English description into an editable draw.io diagram with cloud icons (AWS, Azure, GCP, OCI, Kubernetes).",
        "url": "https://www.anchorterminal.com/tools/diagrams-so",
        "markdownUrl": "https://www.anchorterminal.com/tools/diagrams-so.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/diagrams-so.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/diagrams-so.json",
        "repo": "https://github.com/RedHold/diagrams-sdk",
        "license": "Apache-2.0",
        "transports": [
          "http",
          "stdio"
        ],
        "remoteUrl": "https://api.diagrams.so/api/v2",
        "packages": [
          {
            "registry": "npm",
            "name": "@diagrams-so/mcp"
          },
          {
            "registry": "npm",
            "name": "@diagrams-so/sdk"
          },
          {
            "registry": "pypi",
            "name": "diagrams-so"
          }
        ],
        "auth": "mixed",
        "authNotes": "API keys (dgz_live_ and dgz_test_) as a Bearer header, revocable at once, with a cap of 25 active keys. Test keys spend real credits. The MCP server and SDKs can instead log in through a device flow (npx @diagrams-so/mcp@latest login), where the one-time code is emailed (set DIAGRAMS_LOGIN_EMAIL for the in-chat path) and the credential is cached at ~/.diagrams-so/credentials.json. DIAGRAMS_API_KEY works for CI.",
        "pricing": "freemium",
        "pricingNotes": "Free $0 with 10 one-time credits, no card, public diagrams and watermarked exports. Pro $15 a month or $10 a month billed yearly (75 credits a month), Power $25 a month or $16.67 billed yearly (250 credits). Credit packs $5 per 25. API, MCP and SDKs are on every plan and use the same credits as the app. Reads, exports and prompt helpers are free. Per-action credit costs are shown in the app; the SDK changelog gives 0.5 to 3.0 credits for generate, edit, fix and re-layout. A bring-your-own LLM key skips plan credits. 14-day money-back guarantee on the first paid subscription (https://diagrams.so/pricing).",
        "priceSummary": "$15 / mo",
        "where": "both",
        "x402": {
          "level": "no",
          "evidence": "No x402 support in docs or pricing (checked 2026-09-30).",
          "endpoints": []
        },
        "toolCount": 23,
        "popularity": {
          "githubStars": 0,
          "npmWeekly": 172,
          "pypiWeekly": 3,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://diagrams.so/developers",
        "llmsTxt": "https://diagrams.so/llms.txt",
        "openapi": "https://api.diagrams.so/api/v2/openapi.json",
        "registryName": "io.github.RedHold/diagrams-so-mcp",
        "capabilities": [
          "diagram.create",
          "diagram.edit",
          "diagram.export",
          "diagram.architecture"
        ],
        "tags": [
          "hosted",
          "freemium",
          "free-tier",
          "mcp",
          "llms-txt",
          "openapi",
          "python",
          "typescript"
        ],
        "lastRelease": "2026-08-19",
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 60.1,
          "grade": "C",
          "agentReady": false,
          "rank": 255,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 5,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 85,
            "maintenance": 71,
            "payments": 32,
            "reliability": 30,
            "schema": 85,
            "security": 67,
            "transparency": 75
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": -2,
          "negativeNotes": [
            "Early August 2026. The API moved its device login to an emailed code without notice, which broke the MCP server's in-chat connect path and sent one rejected request per tool call until v1.4.6 fixed it on 19 August. Fixed and documented in the server's changelog, so the deduction is reduced (https://github.com/RedHold/diagrams-mcp-app-core/blob/main/CHANGELOG.md)."
          ],
          "verdict": "API, MCP and SDKs on every plan, including a Free plan marked \"No Card Required\". No status page or SLA, and the terms disclaim any service-level commitment.",
          "strengths": [
            "API, MCP and SDKs on every plan, including a Free plan marked \"No Card Required\"",
            "OpenAPI 3.1 with 32 operations, and an Idempotency-Key on every billable call",
            "All 23 MCP tools carry readOnlyHint or destructiveHint annotations",
            "Editable draw.io XML output with Well-Architected warnings and a fix tool",
            "Terms promise 90 days' notice before a major API version is retired"
          ],
          "weaknesses": [
            "No status page or SLA, and the terms disclaim any service-level commitment",
            "Rate limits exist per key and per IP but no numbers are published",
            "Per-action credit costs are shown only in the app",
            "Domain registered in February 2026, and no commits to either repo since 19 August 2026",
            "Login is a device flow a person must approve by email, so there's no autonomous signup"
          ],
          "agentNotes": [
            "Send an Idempotency-Key on generate, edit, fix and re-layout. If a billable call times out, check `get_usage_history` before retrying",
            "Generation is synchronous and can run for minutes. The SDKs default to a 450 s timeout, or use `POST /diagrams/stream`",
            "Call `list_capabilities` first. `cloud_provider` and `diagram_type` are free strings, and a wrong value fails the call",
            "`relayout_diagram` refuses to run without `confirm=true`, because every re-layout is billed",
            "Test keys (dgz_test_) spend the same credits as live keys"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 4,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "C",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 60.1
            }
          ],
          "editorialScores": {
            "ergonomics": 85,
            "maintenance": 71,
            "payments": 32,
            "reliability": 30,
            "schema": 85,
            "security": 67,
            "transparency": 75
          },
          "provenanceScore": 75
        },
        "connect": {
          "http": "curl https://api.diagrams.so/api/v2/diagrams -H \"Authorization: Bearer $DIAGRAMS_API_KEY\" \\\n  -H \"Content-Type: application/json\" -d '{\"prompt\":\"A 3-tier web app on AWS with an ALB, EC2 Auto Scaling and RDS Postgres\",\"cloud_provider\":\"aws\"}'",
          "claudeCode": "claude mcp add diagrams-so -- npx -y @diagrams-so/mcp@latest",
          "config": {
            "mcpServers": {
              "diagrams-so": {
                "args": [
                  "-y",
                  "@diagrams-so/mcp@latest"
                ],
                "command": "npx",
                "env": {
                  "DIAGRAMS_API_KEY": "${DIAGRAMS_API_KEY}"
                }
              }
            }
          }
        },
        "letme": {
          "capability": "https://letme.dev/diagram.create",
          "tool": "https://letme.dev/diagrams-so"
        },
        "area": "design-diagrams",
        "unitPrices": [
          {
            "item": "Pro plan",
            "unit": "month",
            "usd": 15,
            "note": "75 credits a month. $10 a month billed yearly"
          },
          {
            "item": "Power plan",
            "unit": "month",
            "usd": 25,
            "note": "250 credits a month. $16.67 a month billed yearly"
          },
          {
            "item": "Credit pack",
            "unit": "credit",
            "usd": 0.2,
            "note": "$5 per 25 credits, pack credits don't expire"
          }
        ],
        "provenance": {
          "legalEntity": "RedHold LLC",
          "domain": "diagrams.so",
          "domainRegistered": "2026-02-05",
          "endpointOnVendorDomain": true,
          "terms": "https://diagrams.so/policy/terms",
          "privacy": "https://diagrams.so/policy/privacy",
          "statusPage": "",
          "changelog": "https://diagrams.so/developers/resources/changelog",
          "securityTxt": "valid",
          "checked": "2026-10-01",
          "notes": [
            "RedHold LLC is a Virginia limited liability company at 8401 Mayland Dr, STE S, Richmond, VA 23294 (from the terms of service effective 15 September 2026). We couldn't load a state registry record to confirm it independently",
            "The status and SLA page says a status page will be linked once it is live",
            "security.txt not rechecked on 2026-10-01; valid per the 30 September check"
          ],
          "score": 75
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/diagrams-so.json",
        "live": {
          "slug": "diagrams-so",
          "probe": {
            "target": "https://api.diagrams.so/api/v2",
            "method": "get",
            "lastAt": "2026-10-05T00:15:22.705141655Z",
            "lastOk": true,
            "lastStatus": 404,
            "lastMs": 351,
            "authRequired": false,
            "uptime24h": 97.06,
            "uptime30d": 97.01,
            "p50ms24h": 345,
            "p95ms24h": 405,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 33
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 268
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 240
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 264
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 264
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "versions": [
            {
              "registry": "mcp-registry",
              "name": "io.github.RedHold/diagrams-so-mcp",
              "version": "1.4.6",
              "seenAt": "2026-10-04T23:42:40.113054682Z"
            },
            {
              "registry": "npm",
              "name": "@diagrams-so/mcp",
              "version": "1.4.6",
              "seenAt": "2026-10-04T16:25:36.673190162Z"
            },
            {
              "registry": "npm",
              "name": "@diagrams-so/sdk",
              "version": "1.3.0",
              "seenAt": "2026-10-04T16:25:37.522112948Z"
            },
            {
              "registry": "pypi",
              "name": "diagrams-so",
              "version": "1.3.0",
              "released": "2026-08-05",
              "seenAt": "2026-10-04T16:25:38.902347471Z"
            }
          ],
          "githubStars": 0,
          "npmWeekly": 91,
          "pypiWeekly": 4,
          "securityTxt": {
            "url": "https://diagrams.so/.well-known/security.txt",
            "state": "valid",
            "expires": "2027-08-01T00:00:00Z",
            "checkedAt": "2026-10-04T15:16:00.348168997Z"
          },
          "llmsTxt": {
            "url": "https://diagrams.so/llms.txt",
            "ok": true,
            "status": 200,
            "checkedAt": "2026-10-04T15:17:30.857189856Z"
          },
          "domain": {
            "domain": "diagrams.so",
            "checkedAt": "2026-10-04T13:04:27.501679981Z"
          },
          "pages": [
            {
              "url": "https://diagrams.so/developers/resources/changelog",
              "kind": "changelog",
              "status": 304,
              "checkedAt": "2026-10-04T15:43:04.874729172Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "496d4c3074ab"
            },
            {
              "url": "https://diagrams.so/policy/terms",
              "kind": "deprecations",
              "status": 304,
              "checkedAt": "2026-10-04T15:43:08.963882503Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "862f66aa7b0b"
            },
            {
              "url": "https://diagrams.so/pricing",
              "kind": "pricing",
              "status": 304,
              "checkedAt": "2026-10-04T15:43:10.965792916Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "ae91841e9c40"
            },
            {
              "url": "https://diagrams.so/policy/privacy",
              "kind": "privacy",
              "status": 304,
              "checkedAt": "2026-10-04T15:43:06.971241586Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "6fa8d4562829"
            }
          ],
          "updatedAt": "2026-10-05T00:15:22.705141655Z"
        }
      },
      {
        "slug": "whimsical",
        "name": "Whimsical MCP",
        "vendor": "Whimsical",
        "vendorUrl": "https://whimsical.com",
        "kind": "mcp",
        "category": "diagramming",
        "summary": "Official hosted MCP server for the Whimsical workspace.",
        "url": "https://www.anchorterminal.com/tools/whimsical",
        "markdownUrl": "https://www.anchorterminal.com/tools/whimsical.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/whimsical.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/whimsical.json",
        "repo": "https://github.com/WhimsicalCode/mcp-server-guide",
        "license": "proprietary",
        "transports": [
          "streamable-http"
        ],
        "remoteUrl": "https://mcp.whimsical.com/mcp",
        "packages": [],
        "auth": "oauth",
        "authNotes": "OAuth 2.1 with PKCE, scopes profile, mcp:read and mcp:write. No API keys. The beta REST API also uses OAuth, with client secrets issued by support to approved workspaces.",
        "pricing": "freemium",
        "pricingNotes": "Free $0 with 50 board objects and 50 doc blocks a month, 10 AI credits a member and watermarked exports. Pro $10 an editor a month and Business $20 billed yearly, 17 per cent less than monthly billing. Pro removes the object limit. Every MCP tool works on Free, within those limits (https://whimsical.com/pricing).",
        "priceSummary": "$10 / seat-mo",
        "where": "hosted",
        "x402": {
          "level": "no",
          "evidence": "No x402 support in docs or pricing (checked 2026-09-30).",
          "endpoints": []
        },
        "toolCount": 18,
        "popularity": {
          "githubStars": 5,
          "npmWeekly": null,
          "pypiWeekly": null,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://whimsical.com/learn/integrations/mcp",
        "registryName": "com.whimsical/mcp",
        "capabilities": [
          "diagram.create",
          "diagram.edit",
          "diagram.export"
        ],
        "tags": [
          "hosted",
          "freemium",
          "free-tier",
          "mcp",
          "closed-source"
        ],
        "lastRelease": "2026-09-08",
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 52.7,
          "grade": "D",
          "agentReady": false,
          "rank": 341,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 6,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 46,
            "maintenance": 56,
            "payments": 25,
            "reliability": 60,
            "schema": 54,
            "security": 58,
            "transparency": 72
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": 0,
          "verdict": "OAuth 2.1 with PKCE and separate read and write scopes. No API keys, so it can't run headless or in CI.",
          "strengths": [
            "OAuth 2.1 with PKCE and separate read and write scopes",
            "Flowcharts, mind maps, sequence diagrams, wireframes and docs, with automatic layout",
            "Status page with no incident since 6 March 2026",
            "SOC 2 Type II, a DPA and a published subprocessor list",
            "In the official MCP registry as com.whimsical/mcp, version 1.1.0 since 8 September 2026"
          ],
          "weaknesses": [
            "No API keys, so it can't run headless or in CI",
            "Rate limits and error responses aren't documented",
            "REST API is a closed, read-only beta",
            "Free plan caps creation at 50 board objects a month",
            "Export is PNG snapshots only. No SVG, draw.io or diagram code out"
          ],
          "agentNotes": [
            "Use `generate_diagram` or `generate_mind_map` for laid-out output rather than placing shapes with `create` and `edit`",
            "Call `how_to` for Whimsical's syntax before writing a large diagram",
            "Use `fetch` when you need a PNG snapshot of a board",
            "`delete` removes files or objects without asking. Confirm with the person first"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 3,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "D",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 52.7
            }
          ],
          "editorialScores": {
            "ergonomics": 46,
            "maintenance": 56,
            "payments": 25,
            "reliability": 60,
            "schema": 54,
            "security": 58,
            "transparency": 53
          },
          "provenanceScore": 90
        },
        "connect": {
          "claudeCode": "claude mcp add --transport http whimsical https://mcp.whimsical.com/mcp",
          "config": {
            "mcpServers": {
              "whimsical": {
                "url": "https://mcp.whimsical.com/mcp"
              }
            }
          }
        },
        "letme": {
          "capability": "https://letme.dev/diagram.create",
          "tool": "https://letme.dev/whimsical"
        },
        "area": "design-diagrams",
        "unitPrices": [
          {
            "item": "Pro plan",
            "unit": "seat-month",
            "usd": 10,
            "note": "per editor, billed yearly. Removes the Free object limit"
          },
          {
            "item": "Business plan",
            "unit": "seat-month",
            "usd": 20,
            "note": "per editor, billed yearly. Adds SAML SSO and SCIM"
          }
        ],
        "provenance": {
          "legalEntity": "Whimsical, Inc.",
          "domain": "whimsical.com",
          "domainRegistered": "1998-09-26",
          "domainNote": "whimsical.com was registered in 1998, long before the product launched.",
          "endpointOnVendorDomain": true,
          "terms": "https://whimsical.com/terms",
          "privacy": "https://whimsical.com/terms/privacy",
          "statusPage": "https://status.whimsical.com",
          "changelog": "https://whimsical.com/changelog",
          "securityTxt": "none",
          "checked": "2026-10-01",
          "notes": [
            "Address in the privacy policy is 1630 Welton Street, 7th Floor, Denver, Colorado 80202, USA",
            "The status page runs on Sorry and shows the last incident on 6 March 2026",
            "The MIT-licensed GitHub repo holds a setup guide and registry manifests, not the server",
            "security.txt not rechecked on 2026-10-01; none per the 30 September check"
          ],
          "score": 90
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/whimsical.json",
        "live": {
          "slug": "whimsical",
          "probe": {
            "target": "https://mcp.whimsical.com/mcp",
            "method": "mcp-initialize",
            "lastAt": "2026-10-05T00:15:32.707266388Z",
            "lastOk": true,
            "lastStatus": 401,
            "lastMs": 126,
            "lastNote": "asks for credentials",
            "authRequired": true,
            "uptime24h": 100,
            "uptime30d": 100,
            "p50ms24h": 133,
            "p95ms24h": 299,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 35
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 276
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 248
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 271
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 272
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "vendorStatus": {
            "page": "https://status.whimsical.com",
            "indicator": "unknown",
            "summary": "no machine-readable status found",
            "checkedAt": "2026-10-04T21:40:34.149987666Z"
          },
          "versions": [
            {
              "registry": "mcp-registry",
              "name": "com.whimsical/mcp",
              "version": "1.1.0",
              "seenAt": "2026-10-04T23:42:40.113054682Z"
            }
          ],
          "githubStars": 5,
          "securityTxt": {
            "url": "https://whimsical.com/.well-known/security.txt",
            "state": "none",
            "checkedAt": "2026-10-04T15:16:00.652711817Z"
          },
          "domain": {
            "domain": "whimsical.com",
            "registered": "1998-09-26",
            "source": "https://rdap.verisign.com/com/v1/domain/whimsical.com",
            "checkedAt": "2026-10-04T13:09:41.71766445Z"
          },
          "pages": [
            {
              "url": "https://whimsical.com/changelog",
              "kind": "changelog",
              "status": 200,
              "checkedAt": "2026-10-04T15:48:48.270395498Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "e3b0c44298fc"
            },
            {
              "url": "https://whimsical.com/pricing",
              "kind": "pricing",
              "status": 200,
              "checkedAt": "2026-10-04T15:48:50.384078394Z",
              "changedAt": "2026-10-02T15:25:00.986375786Z",
              "fingerprint": "ba8c84ff8594"
            },
            {
              "url": "https://whimsical.com/terms/privacy",
              "kind": "privacy",
              "status": 200,
              "checkedAt": "2026-10-04T15:48:54.724996499Z",
              "changedAt": "2026-10-02T15:25:05.223921008Z",
              "fingerprint": "bd791e394aec"
            },
            {
              "url": "https://whimsical.com/terms",
              "kind": "terms",
              "status": 200,
              "checkedAt": "2026-10-04T15:48:52.500607347Z",
              "changedAt": "2026-10-02T15:25:03.084028164Z",
              "fingerprint": "1f3e72596005"
            }
          ],
          "mcpTools": {
            "url": "https://mcp.whimsical.com/mcp",
            "checkedAt": "2026-10-04T22:20:00.900748807Z",
            "status": "auth",
            "note": "asks for credentials before listing its tools",
            "changedAt": "2026-09-30T21:57:09.851244047Z"
          },
          "updatedAt": "2026-10-05T00:15:32.707266388Z"
        }
      },
      {
        "slug": "eraser",
        "name": "Eraser API + MCP",
        "vendor": "Eraser",
        "vendorUrl": "https://www.eraser.io",
        "kind": "http-api",
        "category": "diagramming",
        "summary": "Docs and diagrams workspace for engineers.",
        "url": "https://www.anchorterminal.com/tools/eraser",
        "markdownUrl": "https://www.anchorterminal.com/tools/eraser.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/eraser.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/eraser.json",
        "transports": [
          "http",
          "streamable-http",
          "stdio"
        ],
        "remoteUrl": "https://app.eraser.io/api",
        "packages": [
          {
            "registry": "npm",
            "name": "@eraserlabs/eraser-mcp"
          }
        ],
        "auth": "mixed",
        "authNotes": "REST API takes a team API token as a Bearer header, and tokens are only issued to paid teams. The hosted MCP uses OAuth by default (billed to the signed-in user's AI credits) or the same token as a Bearer header (billed to team credits). The local npm server reads ERASER_API_KEY.",
        "pricing": "freemium",
        "pricingNotes": "Free plan $0 with 3 AI diagrams. Starter $15 a member a month billed yearly ($20 monthly) with 40 AI credits, Business $45 billed yearly ($60 monthly) with 250, Enterprise custom. The API needs a paid plan with usage-based pricing switched on. /render/prompt costs $80 per 100 calls, /render/elements $20 per 100 calls, extra AI credits $60 per 100. The MCP server is free within plan limits (https://www.eraser.io/pricing).",
        "priceSummary": "$20 / seat-mo",
        "where": "both",
        "x402": {
          "level": "no",
          "evidence": "No x402 support in docs or pricing (checked 2026-09-30).",
          "endpoints": []
        },
        "toolCount": 42,
        "popularity": {
          "githubStars": null,
          "npmWeekly": 76,
          "pypiWeekly": null,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://docs.eraser.io/reference/getting-started",
        "llmsTxt": "https://docs.eraser.io/llms.txt",
        "registryName": "io.eraser/eraser",
        "capabilities": [
          "diagram.create",
          "diagram.as-code",
          "diagram.edit",
          "diagram.export",
          "diagram.architecture"
        ],
        "tags": [
          "hosted",
          "freemium",
          "mcp",
          "llms-txt",
          "diagram-as-code",
          "closed-source",
          "enterprise",
          "typescript"
        ],
        "lastRelease": "2026-05-22",
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 38.7,
          "grade": "E",
          "agentReady": false,
          "rank": 427,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 7,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 34,
            "maintenance": 33,
            "payments": 35,
            "reliability": 15,
            "schema": 52,
            "security": 57,
            "transparency": 51
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": 0,
          "verdict": "Hosted MCP with OAuth and 41 tools, including `manually_` tools that skip the AI when the agent writes the diagram code. No status page, rate limits, SLA or changelog.",
          "strengths": [
            "Hosted MCP with OAuth and 41 tools, including `manually_` tools that skip the AI when the agent writes the diagram code",
            "Diagram-as-code for architecture, flowchart, ERD, sequence and BPMN diagrams",
            "Per-call API prices published, $0.80 per AI render and $0.20 per code render",
            "SOC 2 Type 2 report, and an audit log API with ECS and Splunk formats on Enterprise"
          ],
          "weaknesses": [
            "No status page, rate limits, SLA or changelog",
            "No OpenAPI file, and the hosted tool definitions aren't public",
            "REST API needs a paid team plus usage-based billing, with one unscoped token per team",
            "41 tools load at once with no subset",
            "Newest dated change found is 22 May 2026"
          ],
          "agentNotes": [
            "Use `manually_create_diagram` with your own Eraser code when you know the structure. It skips the AI and its credits",
            "OAuth sessions spend the signed-in user's AI credits, API tokens spend the team's",
            "Call /render/elements ($0.20) when you already have diagram code; /render/prompt costs $0.80",
            "Set a spend limit before running in CI. At 100 per cent the API stops until the next calendar month"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 3,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "E",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 38.7
            }
          ],
          "editorialScores": {
            "ergonomics": 34,
            "maintenance": 33,
            "payments": 35,
            "reliability": 15,
            "schema": 52,
            "security": 57,
            "transparency": 31
          },
          "provenanceScore": 70
        },
        "connect": {
          "http": "curl -X POST https://app.eraser.io/api/render/prompt -H \"Authorization: Bearer $ERASER_API_KEY\" \\\n  -H \"Content-Type: application/json\" -d '{\"text\":\"Draw a data model for a Twitter clone\"}'",
          "claudeCode": "claude mcp add --transport http eraser https://app.eraser.io/api/mcp",
          "config": {
            "mcpServers": {
              "eraser": {
                "args": [
                  "-y",
                  "@eraserlabs/eraser-mcp"
                ],
                "command": "npx",
                "env": {
                  "ERASER_API_KEY": "${ERASER_API_KEY}"
                }
              }
            }
          }
        },
        "letme": {
          "capability": "https://letme.dev/diagram.create",
          "tool": "https://letme.dev/eraser"
        },
        "area": "design-diagrams",
        "unitPrices": [
          {
            "item": "Starter plan",
            "unit": "seat-month",
            "usd": 20,
            "note": "billed monthly, $15 billed yearly. First plan with API access"
          },
          {
            "item": "Business plan",
            "unit": "seat-month",
            "usd": 60,
            "note": "billed monthly, $45 billed yearly"
          },
          {
            "item": "API /render/prompt",
            "unit": "call",
            "usd": 0.8,
            "note": "$80 per 100 calls, AI generation"
          },
          {
            "item": "API /render/elements",
            "unit": "call",
            "usd": 0.2,
            "note": "$20 per 100 calls, renders your own diagram code"
          },
          {
            "item": "Extra AI credits",
            "unit": "credit",
            "usd": 0.6,
            "note": "$60 per 100 credits beyond the plan"
          }
        ],
        "provenance": {
          "legalEntity": "Eraser Labs, Inc.",
          "domain": "eraser.io",
          "domainRegistered": "2014-10-03",
          "endpointOnVendorDomain": true,
          "terms": "https://www.eraser.io/terms",
          "privacy": "https://www.eraser.io/privacy",
          "statusPage": "",
          "changelog": "",
          "securityTxt": "none",
          "checked": "2026-10-01",
          "notes": [
            "Eraser Labs, Inc., 548 Market St, PMB 47670, San Francisco, CA 94104 (privacy policy)",
            "SOC 2 Type 2 report available through the trust portal at eraser.trustshare.com",
            "status.eraser.io doesn't resolve and eraser.io/changelog returns 404",
            "security.txt not rechecked on 2026-10-01; none per the 30 September check"
          ],
          "score": 70
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/eraser.json",
        "live": {
          "slug": "eraser",
          "probe": {
            "target": "https://app.eraser.io/api",
            "method": "get",
            "lastAt": "2026-10-05T00:15:23.173413877Z",
            "lastOk": true,
            "lastStatus": 404,
            "lastMs": 145,
            "authRequired": false,
            "uptime24h": 100,
            "uptime30d": 100,
            "p50ms24h": 143,
            "p95ms24h": 424,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 35
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 276
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 248
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 271
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 272
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "versions": [
            {
              "registry": "mcp-registry",
              "name": "io.eraser/eraser",
              "version": "0.2.0",
              "seenAt": "2026-10-04T23:42:40.113054682Z"
            },
            {
              "registry": "npm",
              "name": "@eraserlabs/eraser-mcp",
              "version": "0.8.0",
              "seenAt": "2026-10-04T16:26:40.51897259Z"
            }
          ],
          "npmWeekly": 91,
          "securityTxt": {
            "url": "https://eraser.io/.well-known/security.txt",
            "state": "none",
            "checkedAt": "2026-10-04T15:15:54.712764659Z"
          },
          "llmsTxt": {
            "url": "https://docs.eraser.io/llms.txt",
            "ok": true,
            "status": 200,
            "checkedAt": "2026-10-04T15:17:45.173695534Z"
          },
          "domain": {
            "domain": "eraser.io",
            "checkedAt": "2026-10-04T13:07:10.744092154Z"
          },
          "pages": [
            {
              "url": "https://www.eraser.io/pricing",
              "kind": "pricing",
              "status": 200,
              "checkedAt": "2026-10-04T15:50:12.049190538Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "308b8025c589"
            },
            {
              "url": "https://www.eraser.io/privacy",
              "kind": "privacy",
              "status": 200,
              "checkedAt": "2026-10-04T15:50:14.104270218Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "0a831aeafaf4"
            },
            {
              "url": "https://www.eraser.io/terms",
              "kind": "terms",
              "status": 200,
              "checkedAt": "2026-10-04T15:50:16.099759122Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "45be14fec815"
            }
          ],
          "updatedAt": "2026-10-05T00:15:23.173413877Z"
        }
      },
      {
        "slug": "cloudviz",
        "name": "Cloudviz API",
        "vendor": "Cloudviz",
        "vendorUrl": "https://cloudviz.io",
        "kind": "http-api",
        "category": "diagramming",
        "summary": "Generates AWS architecture diagrams from a live account.",
        "url": "https://www.anchorterminal.com/tools/cloudviz",
        "markdownUrl": "https://www.anchorterminal.com/tools/cloudviz.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/cloudviz.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/cloudviz.json",
        "transports": [
          "http"
        ],
        "remoteUrl": "https://api.cloudviz.io",
        "packages": [],
        "auth": "api-key",
        "authNotes": "API key in the x-api-key header, created in the app under Manage API Keys. Each key is read or read and write, and can be changed at any time. Cloudviz reads your AWS account through a cross-account read-only IAM role.",
        "pricing": "paid",
        "pricingNotes": "10-day free trial. Base $9.95 per user a month with 3 AWS accounts and no API. Team $49 a month for 10 users with unlimited AWS accounts, API access, SSO and 20 automated diagrams. Enterprise (self-hosted, unlimited users) by quote. Annual billing is up to 30 per cent off, and AWS Marketplace billing is available (https://cloudviz.io/pricing).",
        "priceSummary": "$9.95 / seat-mo",
        "where": "hosted",
        "x402": {
          "level": "no",
          "endpoints": []
        },
        "toolCount": null,
        "popularity": {
          "githubStars": null,
          "npmWeekly": null,
          "pypiWeekly": null,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://cloudviz.io/developers",
        "openapi": "https://cloudviz.io/assets/developers/openapi.json",
        "capabilities": [
          "diagram.create",
          "diagram.export",
          "diagram.architecture"
        ],
        "tags": [
          "hosted",
          "closed-source",
          "openapi",
          "async-jobs",
          "enterprise"
        ],
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 37.9,
          "grade": "F",
          "agentReady": false,
          "rank": 432,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 8,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 50,
            "maintenance": 5,
            "payments": 20,
            "reliability": 20,
            "schema": 58,
            "security": 53,
            "transparency": 47
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": 0,
          "verdict": "Diagrams come from the live AWS account through a read-only cross-account role with a per-customer external ID. AWS only, and API access starts at the $49 a month Team plan.",
          "strengths": [
            "Diagrams come from the live AWS account through a read-only cross-account role with a per-customer external ID",
            "One GET returns svg, png, pdf, drawio, jsonDiagram or jsonSnapshot",
            "Public OpenAPI 3.0.3 file with 7 operations and documented status codes",
            "API keys can be read-only"
          ],
          "weaknesses": [
            "AWS only, and API access starts at the $49 a month Team plan",
            "Throttling on rate, burst and daily count with no published numbers",
            "No status page, changelog, SLA or security.txt",
            "No dated product update found since March 2025"
          ],
          "agentNotes": [
            "Call `GET /aws/accounts/` first to get the Cloudviz account ID, then request `/aws/accounts/{account-id}/{region}/{format}`",
            "On a 202, wait and repeat the same GET until the diagram is ready",
            "Ask for `jsonSnapshot` or `jsonDiagram` (there is no plain `json` format) when the agent has to reason over resources",
            "Use a read-only key unless the agent has to add, change or delete AWS accounts"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 2.5,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "F",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 37.9
            }
          ],
          "editorialScores": {
            "ergonomics": 50,
            "maintenance": 5,
            "payments": 20,
            "reliability": 20,
            "schema": 58,
            "security": 53,
            "transparency": 38
          },
          "provenanceScore": 55
        },
        "connect": {
          "http": "curl https://api.cloudviz.io/aws/accounts/ -H \"x-api-key: $CLOUDVIZ_API_KEY\""
        },
        "letme": {
          "capability": "https://letme.dev/diagram.create",
          "tool": "https://letme.dev/cloudviz"
        },
        "area": "design-diagrams",
        "unitPrices": [
          {
            "item": "Base plan",
            "unit": "seat-month",
            "usd": 9.95,
            "note": "billed monthly, no API access"
          },
          {
            "item": "Team plan",
            "unit": "month",
            "usd": 49,
            "note": "10 users, first plan with API access, billed monthly"
          }
        ],
        "provenance": {
          "legalEntity": "SIA Cloudviz Solutions",
          "domain": "cloudviz.io",
          "domainRegistered": "",
          "endpointOnVendorDomain": true,
          "terms": "https://cloudviz.io/terms",
          "privacy": "https://cloudviz.io/privacy",
          "statusPage": "",
          "changelog": "",
          "securityTxt": "none",
          "checked": "2026-10-01",
          "notes": [
            "SIA is a Latvian limited company, registration number 44103120286, legal address Rīgas iela 22A-53, Limbaži, LV-4001 (firmas.lv)",
            "Terms are governed by Latvian law and were last updated on 26 March 2019",
            "No RDAP service answers for .io, so the registration date is unknown",
            "/.well-known/security.txt returns 404. The security page names security@cloudviz.io"
          ],
          "score": 55
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/cloudviz.json",
        "live": {
          "slug": "cloudviz",
          "probe": {
            "target": "https://api.cloudviz.io",
            "method": "get",
            "lastAt": "2026-10-05T00:15:21.634321067Z",
            "lastOk": true,
            "lastStatus": 403,
            "lastMs": 60,
            "lastNote": "asks for credentials",
            "authRequired": true,
            "uptime24h": 100,
            "uptime30d": 100,
            "p50ms24h": 54,
            "p95ms24h": 81,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 35
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 276
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 248
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 271
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 272
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "securityTxt": {
            "url": "https://cloudviz.io/.well-known/security.txt",
            "state": "none",
            "checkedAt": "2026-10-04T15:15:48.135776442Z"
          },
          "domain": {
            "domain": "cloudviz.io",
            "checkedAt": "2026-10-04T13:03:55.142223054Z"
          },
          "pages": [
            {
              "url": "https://cloudviz.io/pricing",
              "kind": "pricing",
              "status": 304,
              "checkedAt": "2026-10-04T15:41:56.660296464Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "65ac1cddb5ad"
            },
            {
              "url": "https://cloudviz.io/privacy",
              "kind": "privacy",
              "status": 304,
              "checkedAt": "2026-10-04T15:41:58.748228444Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "b4c608710d46"
            },
            {
              "url": "https://cloudviz.io/terms",
              "kind": "terms",
              "status": 304,
              "checkedAt": "2026-10-04T15:42:00.745778047Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "f319fbc0e66d"
            }
          ],
          "updatedAt": "2026-10-05T00:15:21.634321067Z"
        }
      },
      {
        "slug": "mermaid-chart",
        "name": "Mermaid Chart MCP",
        "vendor": "Mermaid Chart",
        "vendorUrl": "https://mermaid.ai",
        "kind": "mcp",
        "category": "diagramming",
        "summary": "Hosted MCP server for Mermaid diagrams from mermaid.ai.",
        "url": "https://www.anchorterminal.com/tools/mermaid-chart",
        "markdownUrl": "https://www.anchorterminal.com/tools/mermaid-chart.md",
        "slimMarkdownUrl": "https://www.anchorterminal.com/tools/mermaid-chart.min.md",
        "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/mermaid-chart.json",
        "transports": [
          "streamable-http",
          "sse"
        ],
        "remoteUrl": "https://mcp.mermaid.ai/mcp",
        "packages": [
          {
            "registry": "npm",
            "name": "@mermaidchart/sdk"
          }
        ],
        "auth": "mixed",
        "authNotes": "Render and validation tools need no auth. Account tools need a Mermaid Chart token generated in account settings and sent as the Authorization header (the docs show the raw token, no Bearer prefix). The TypeScript SDK uses OAuth.",
        "pricing": "freemium",
        "pricingNotes": "Basic $0 with 3 diagrams and 15 AI credits. Plus $10 a user a month billed yearly ($12 monthly) with unlimited diagrams and 300 AI credits a year. Premium $20 billed yearly ($24 monthly) with 2,000 AI credits a year and free viewer seats. Enterprise custom. The render tools on the MCP server are free without an account (https://mermaid.ai/pricing).",
        "priceSummary": "$12 / seat-mo",
        "where": "hosted",
        "x402": {
          "level": "no",
          "evidence": "No x402 support in docs or pricing (checked 2026-09-30).",
          "endpoints": []
        },
        "toolCount": 25,
        "popularity": {
          "githubStars": null,
          "npmWeekly": 395,
          "pypiWeekly": null,
          "asOf": "2026-09-30"
        },
        "docsUrl": "https://mermaid.ai/docs/ai/mcp-server",
        "registryName": "com.mermaidchart/mermaid-mcp",
        "capabilities": [
          "diagram.create",
          "diagram.as-code",
          "diagram.edit",
          "diagram.export"
        ],
        "tags": [
          "hosted",
          "freemium",
          "free-tier",
          "mcp",
          "diagram-as-code",
          "closed-source"
        ],
        "lastRelease": "2026-09-17",
        "graded": true,
        "anchor": {
          "graded": true,
          "score": 31.7,
          "grade": "F",
          "agentReady": false,
          "rank": 442,
          "ranked": true,
          "rankOf": 452,
          "categoryRank": 9,
          "methodology": "0.3",
          "run": "2026-10-01",
          "scores": {
            "ergonomics": 34,
            "maintenance": 53,
            "payments": 45,
            "reliability": 15,
            "schema": 32,
            "security": 20,
            "transparency": 48
          },
          "pending": [
            "performance",
            "tasks"
          ],
          "assessment": {
            "confidence": "medium",
            "date": "2026-10-01"
          },
          "negative": 0,
          "verdict": "Validation and rendering work with no account or key. Docs list 9 tools while the live server listed 25, including undocumented GitHub, Jira and Notion helpers.",
          "strengths": [
            "Validation and rendering work with no account or key",
            "Mermaid is plain-text diagram-as-code that renders natively on GitHub and many docs tools",
            "Hosted, nothing to install, streamable HTTP and SSE",
            "Official MIT TypeScript SDK, release 0.2.8 on 17 September 2026"
          ],
          "weaknesses": [
            "Docs list 9 tools while the live server listed 25, including undocumented GitHub, Jira and Notion helpers",
            "Account tools take a raw token in the Authorization header, with no OAuth or scopes",
            "No status page, rate limits, changelog, security page or SLA",
            "Privacy policy last updated September 2024 and names no AI provider",
            "No public REST API reference, and API access is by application form"
          ],
          "agentNotes": [
            "Call `validate_and_render_mermaid_diagram` to check syntax before committing Mermaid to a repo. It needs no token",
            "Only add the token if you need to save into Mermaid Chart projects. It reaches every project on the account",
            "If you only need a picture, the open-source mermaid-cli renders locally with no network call",
            "Use mcp.mermaid.ai. The registry still lists the older mcp.mermaidchart.com host"
          ],
          "metrics": {
            "kind": "remote",
            "measured": false
          },
          "reviewCount": 2,
          "avgRating": 2.5,
          "history": [
            {
              "basis": "public evidence",
              "confidence": "medium",
              "grade": "F",
              "methodology": "0.3",
              "pending": [
                "performance",
                "tasks"
              ],
              "run": "2026-10-01",
              "runLabel": "October 2026 research run",
              "score": 31.7
            }
          ],
          "editorialScores": {
            "ergonomics": 34,
            "maintenance": 53,
            "payments": 45,
            "reliability": 15,
            "schema": 32,
            "security": 20,
            "transparency": 29
          },
          "provenanceScore": 66
        },
        "connect": {
          "claudeCode": "claude mcp add --transport http mermaid https://mcp.mermaid.ai/mcp --header \"Authorization: $MERMAID_CHART_TOKEN\"",
          "config": {
            "mcpServers": {
              "mermaid": {
                "headers": {
                  "Authorization": "${MERMAID_CHART_TOKEN}"
                },
                "type": "http",
                "url": "https://mcp.mermaid.ai/mcp"
              }
            }
          }
        },
        "letme": {
          "capability": "https://letme.dev/diagram.create",
          "tool": "https://letme.dev/mermaid-chart"
        },
        "area": "design-diagrams",
        "unitPrices": [
          {
            "item": "Plus plan",
            "unit": "seat-month",
            "usd": 12,
            "note": "billed monthly, $10 billed yearly. 300 AI credits a year"
          },
          {
            "item": "Premium plan",
            "unit": "seat-month",
            "usd": 24,
            "note": "billed monthly, $20 billed yearly. 2,000 AI credits a year"
          }
        ],
        "provenance": {
          "legalEntity": "Mermaid Chart Inc.",
          "domain": "mermaid.ai",
          "domainRegistered": "2017-12-16",
          "domainNote": "mermaid.ai was registered in 2017 and transferred on 2025-06-02. The company's earlier domain, mermaidchart.com, was registered on 2022-06-14 and now redirects here.",
          "endpointOnVendorDomain": true,
          "terms": "https://mermaid.ai/terms-and-conditions",
          "privacy": "https://mermaid.ai/web/privacy-policy",
          "statusPage": "",
          "changelog": "",
          "securityTxt": "unknown",
          "checked": "2026-10-01",
          "notes": [
            "Mermaid Chart Inc., 548 Market Street, PMB 75432, San Francisco, CA 94104-5401 (privacy policy, last updated 13 September 2024)",
            "The terms are governed by Delaware law and give no postal address",
            "/.well-known/security.txt and /llms.txt on mermaid.ai returned 401 on 30 September, so neither could be read",
            "The official MCP registry entry, published 2025-09-18, still points at mcp.mermaidchart.com"
          ],
          "score": 66
        },
        "pageJsonUrl": "https://www.anchorterminal.com/tools/mermaid-chart.json",
        "live": {
          "slug": "mermaid-chart",
          "probe": {
            "target": "https://mcp.mermaid.ai/mcp",
            "method": "mcp-initialize",
            "lastAt": "2026-10-05T00:15:26.296682725Z",
            "lastOk": true,
            "lastStatus": 200,
            "lastMs": 468,
            "lastNote": "initialize answered",
            "authRequired": false,
            "uptime24h": 100,
            "uptime30d": 100,
            "p50ms24h": 465,
            "p95ms24h": 564,
            "samples24h": 272,
            "samples30d": 1105,
            "days": [
              {
                "date": "2026-09-30",
                "probes": 35,
                "ok": 35
              },
              {
                "date": "2026-10-01",
                "probes": 276,
                "ok": 276
              },
              {
                "date": "2026-10-02",
                "probes": 248,
                "ok": 248
              },
              {
                "date": "2026-10-03",
                "probes": 271,
                "ok": 271
              },
              {
                "date": "2026-10-04",
                "probes": 272,
                "ok": 272
              },
              {
                "date": "2026-10-05",
                "probes": 3,
                "ok": 3
              }
            ]
          },
          "versions": [
            {
              "registry": "mcp-registry",
              "name": "com.mermaidchart/mermaid-mcp",
              "version": "1.0.0",
              "seenAt": "2026-10-04T23:42:40.113054682Z"
            },
            {
              "registry": "npm",
              "name": "@mermaidchart/sdk",
              "version": "0.2.8",
              "seenAt": "2026-10-04T16:32:56.186996112Z"
            }
          ],
          "npmWeekly": 396,
          "securityTxt": {
            "url": "https://mermaid.ai/.well-known/security.txt",
            "state": "unknown",
            "checkedAt": "2026-10-04T15:16:05.125361402Z"
          },
          "domain": {
            "domain": "mermaid.ai",
            "registered": "2017-12-16",
            "source": "https://rdap.identitydigital.services/rdap/domain/mermaid.ai",
            "checkedAt": "2026-10-04T13:04:50.094930879Z"
          },
          "pages": [
            {
              "url": "https://mermaid.ai/pricing",
              "kind": "pricing",
              "status": 304,
              "checkedAt": "2026-10-04T15:45:52.901253273Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "e3b0c44298fc"
            },
            {
              "url": "https://mermaid.ai/privacy-policy",
              "kind": "privacy",
              "status": 200,
              "checkedAt": "2026-10-01T13:14:15.99559282Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "6adb40a489d6"
            },
            {
              "url": "https://mermaid.ai/web/privacy-policy",
              "kind": "privacy",
              "status": 304,
              "checkedAt": "2026-10-04T15:45:57.087908761Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "6adb40a489d6"
            },
            {
              "url": "https://mermaid.ai/terms-and-conditions",
              "kind": "terms",
              "status": 304,
              "checkedAt": "2026-10-04T15:45:55.113516464Z",
              "changedAt": "0001-01-01T00:00:00Z",
              "fingerprint": "828240567260"
            }
          ],
          "mcpTools": {
            "url": "https://mcp.mermaid.ai/mcp",
            "checkedAt": "2026-10-04T22:19:47.546353564Z",
            "status": "ok",
            "protocol": "2025-11-25",
            "tools": [
              {
                "name": "validate_and_render_mermaid_diagram",
                "description": "SIMPLE RENDER TOOL - Renders Mermaid diagrams directly (Mermaid automatically validates during rendering). If successful, returns diagram image. If Mermaid validation fails, returns error details for fixing. One tool, one call, simple workflow.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server (e.g., 'claude', 'cursor', 'vscode', 'chatgpt', 'copilot') for analytics tracking.",
                      "type": "string"
                    },
                    "diagramType": {
                      "description": "The type of Mermaid diagram (e.g., 'flowchart', 'sequenceDiagram', 'gantt').",
                      "type": "string"
                    },
                    "mermaidCode": {
                      "description": "Mermaid code to render. Mermaid validates automatically during rendering - if invalid, tool returns error details for fixing.",
                      "type": "string"
                    },
                    "prompt": {
                      "description": "A text description of the diagram to generate.",
                      "type": "string"
                    },
                    "useUrlShortener": {
                      "default": true,
                      "description": "Whether to use URL shortening for the Mermaid link. Defaults to true, set to false to disable shortening.",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "prompt",
                    "mermaidCode",
                    "diagramType",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "get_diagram_title",
                "description": "Generate a descriptive title for a Mermaid diagram based on its content. This tool analyzes the diagram structure and content to suggest an appropriate title.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server (e.g., 'claude', 'cursor', 'vscode', 'chatgpt', 'copilot') for analytics tracking.",
                      "type": "string"
                    },
                    "currentTitle": {
                      "description": "Optional: The current title of the diagram, if any, for context.",
                      "type": "string"
                    },
                    "diagramContent": {
                      "description": "The Mermaid diagram content/code for which to generate a title.",
                      "type": "string"
                    },
                    "diagramType": {
                      "description": "Optional: The type of Mermaid diagram (e.g., 'flowchart', 'sequenceDiagram', 'gantt') for better context in title generation.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "diagramContent",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "get_diagram_summary",
                "description": "Generate a concise summary for a Mermaid diagram based on its content. This tool provides prompts for the LLM to generate a brief summary (2-4 sentences) highlighting the primary flow, key decisions, and outcomes.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server (e.g., 'claude', 'cursor', 'vscode', 'chatgpt', 'copilot') for analytics tracking.",
                      "type": "string"
                    },
                    "contextHint": {
                      "description": "Optional: Context hint to help generate a more accurate summary.",
                      "type": "string"
                    },
                    "diagramContent": {
                      "description": "The Mermaid diagram content/code for which to generate a summary.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "diagramContent",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "search_mermaid_icons",
                "description": "Search for available Mermaid icons by provider or name. Returns icons in ready-to-use format with provider prefixes (e.g., 'aws:arch-amazon-ec2'). PERFORMANCE TIP: For faster searches, start with limit=10 and specific queries. If no suitable icons found, increase limit and retry. Supports AWS, Azure, GCP, and FontAwesome icon sets.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server (e.g., 'claude', 'cursor', 'vscode', 'chatgpt', 'copilot') for analytics tracking.",
                      "type": "string"
                    },
                    "limit": {
                      "default": 10,
                      "description": "Optional: Maximum number of results to return per provider. Defaults to 10 for performance. Increase if needed.",
                      "type": "number"
                    },
                    "provider": {
                      "description": "Optional: Filter by specific provider ('aws', 'azure', 'gcp', 'fa'). If not provided, searches all providers.",
                      "type": "string"
                    },
                    "query": {
                      "description": "Search query for icons (e.g., 'aws', 'azure', 'gcp', 'fa', 'lambda', 's3', 'database'). Use specific terms for better results.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "query",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "get_mermaid_syntax_document",
                "description": "Get comprehensive syntax documentation and examples for a specific Mermaid diagram type. Returns the official Mermaid.js documentation with syntax rules, examples, and usage instructions for the requested diagram type.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server (e.g., 'claude', 'cursor', 'vscode', 'chatgpt', 'copilot') for analytics tracking.",
                      "type": "string"
                    },
                    "diagramType": {
                      "description": "The type of Mermaid diagram to get syntax documentation for (e.g., 'flowchart', 'sequenceDiagram', 'architecture-beta', 'gantt', 'gitgraph', 'classDiagram', 'stateDiagram', etc.).",
                      "type": "string"
                    }
                  },
                  "required": [
                    "diagramType",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "list_tools",
                "description": "Lists all available MCP servers and their tools in the workspace.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "OPTIONAL: The name of the client/agent using the MCP server (e.g., 'claude', 'cursor', 'vscode', 'chatgpt', 'copilot') for analytics tracking.",
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "list_repos",
                "description": "List GitHub repositories for the authenticated user, or for an organization when `org` is set. REQUIRES: `Github-Token` header (HTTP) or `GITHUB_TOKEN` / `GH_TOKEN` in the server environment.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "org": {
                      "description": "Optional: organization login. If set, lists that org's repositories; otherwise lists repos for the authenticated user.",
                      "type": "string"
                    },
                    "page": {
                      "default": 1,
                      "maximum": 9007199254740991,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "per_page": {
                      "default": 30,
                      "maximum": 100,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "type": {
                      "default": "all",
                      "description": "User repo filter; ignored when `org` is set.",
                      "enum": [
                        "all",
                        "owner",
                        "member",
                        "public",
                        "private"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "list_mermaid_files",
                "description": "List .mmd Mermaid files in a GitHub repository (code search with tree fallback). REQUIRES: `Github-Token` header (HTTP) or GITHUB_TOKEN / GH_TOKEN.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "owner": {
                      "description": "Repository owner (user or organization).",
                      "type": "string"
                    },
                    "ref": {
                      "description": "Optional branch, tag, or commit for tree fallback when code search is unavailable.",
                      "type": "string"
                    },
                    "repo": {
                      "description": "Repository name.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "read_mermaid_file",
                "description": "Read a single .mmd file from a GitHub repository. Only paths ending in .mmd are allowed. REQUIRES: `Github-Token` header (HTTP) or GITHUB_TOKEN / GH_TOKEN.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    },
                    "path": {
                      "description": "Path to the .mmd file in the repository.",
                      "type": "string"
                    },
                    "ref": {
                      "description": "Optional: branch, tag, or commit SHA; defaults to the default branch.",
                      "type": "string"
                    },
                    "repo": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "path",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "create_pr",
                "description": "Create a new branch (git ref), one commit from the base tree with your file changes, then open a pull request in the same repository. REQUIRES: `Github-Token` (HTTP) or GITHUB_TOKEN with `contents: write` (and no existing branch with the same `headBranch` name).",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "baseBranch": {
                      "description": "Branch to base the PR on (e.g. main). Defaults to the repo default branch.",
                      "type": "string"
                    },
                    "body": {
                      "description": "PR description (markdown).",
                      "type": "string"
                    },
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "commitMessage": {
                      "description": "Single commit message for the file changes.",
                      "type": "string"
                    },
                    "files": {
                      "description": "Files to add or update.",
                      "items": {
                        "properties": {
                          "content": {
                            "description": "Full UTF-8 file content.",
                            "type": "string"
                          },
                          "path": {
                            "description": "Repo-relative file path.",
                            "type": "string"
                          }
                        },
                        "required": [
                          "path",
                          "content"
                        ],
                        "type": "object"
                      },
                      "minItems": 1,
                      "type": "array"
                    },
                    "headBranch": {
                      "description": "Name of the new branch (must not already exist on the remote).",
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    },
                    "repo": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "headBranch",
                    "title",
                    "body",
                    "commitMessage",
                    "files",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": false
                }
              },
              {
                "name": "push_file",
                "description": "Create or update a single file on a given branch in a GitHub repository. REQUIRES: `Github-Token` (HTTP) or GITHUB_TOKEN with contents write access.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "branch": {
                      "description": "Branch to commit to.",
                      "type": "string"
                    },
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "content": {
                      "description": "Full file content.",
                      "type": "string"
                    },
                    "message": {
                      "description": "Commit message.",
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    },
                    "path": {
                      "type": "string"
                    },
                    "repo": {
                      "type": "string"
                    },
                    "sha": {
                      "description": "Existing blob SHA to update; omit to create or to let the service detect.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "path",
                    "content",
                    "branch",
                    "message",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": false
                }
              },
              {
                "name": "list_pulls",
                "description": "List pull requests for a GitHub repository. REQUIRES: `Github-Token` (HTTP) or GITHUB_TOKEN / GH_TOKEN.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    },
                    "page": {
                      "default": 1,
                      "maximum": 9007199254740991,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "per_page": {
                      "default": 30,
                      "maximum": 100,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "repo": {
                      "type": "string"
                    },
                    "state": {
                      "default": "open",
                      "enum": [
                        "open",
                        "closed",
                        "all"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "list_branches",
                "description": "List or resolve branch names. **List mode (default):** one `GET /repos/.../branches?per_page=100\u0026page=1` — at most 100 names, A–Z sorted in the response; `has_more` if a full page was returned. **Resolve mode:** set `branch_name` for a single `GET` branch (404 if missing). At most one GitHub API call. REQUIRES: `Github-Token` (HTTP) or GITHUB_TOKEN / GH_TOKEN.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "branch_name": {
                      "description": "Exact branch name. When non-empty, returns that branch only. Omit to fetch the first 100 branches only.",
                      "type": "string"
                    },
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    },
                    "repo": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "list_issues",
                "description": "List issues for a repository (excludes pull requests). REQUIRES: `Github-Token` (HTTP) or GITHUB_TOKEN / GH_TOKEN.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "direction": {
                      "default": "desc",
                      "enum": [
                        "asc",
                        "desc"
                      ],
                      "type": "string"
                    },
                    "labels": {
                      "description": "Comma-separated label names (GitHub API format).",
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    },
                    "page": {
                      "default": 1,
                      "maximum": 9007199254740991,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "per_page": {
                      "default": 30,
                      "maximum": 100,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "repo": {
                      "type": "string"
                    },
                    "since": {
                      "description": "ISO 8601: only issues updated at or after this time.",
                      "type": "string"
                    },
                    "sort": {
                      "default": "created",
                      "enum": [
                        "created",
                        "updated",
                        "comments"
                      ],
                      "type": "string"
                    },
                    "state": {
                      "default": "open",
                      "enum": [
                        "open",
                        "closed",
                        "all"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "create_issue",
                "description": "Create an issue in a GitHub repository. REQUIRES: `Github-Token` (HTTP) or GITHUB_TOKEN with issues write if creating issues in private repos.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "body": {
                      "description": "Issue body in markdown.",
                      "type": "string"
                    },
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "labels": {
                      "description": "Label names (must already exist in the repository).",
                      "items": {
                        "type": "string"
                      },
                      "type": "array"
                    },
                    "owner": {
                      "type": "string"
                    },
                    "repo": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "title",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": false
                }
              },
              {
                "name": "get_issue_comments",
                "description": "List comments on an issue by issue number. REQUIRES: `Github-Token` (HTTP) or GITHUB_TOKEN / GH_TOKEN.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "issue_number": {
                      "description": "Issue number (not a PR number unless the PR is also addressed as an issue on GitHub).",
                      "maximum": 9007199254740991,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "owner": {
                      "type": "string"
                    },
                    "page": {
                      "default": 1,
                      "maximum": 9007199254740991,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "per_page": {
                      "default": 30,
                      "maximum": 100,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "repo": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "issue_number",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "get_pull_comments",
                "description": "Get all pull request comments: both issue/PR thread comments and inline review comments, with a `type` of `issue_thread` or `review` per item. REQUIRES: `Github-Token` (HTTP) or GITHUB_TOKEN / GH_TOKEN.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    },
                    "page": {
                      "default": 1,
                      "maximum": 9007199254740991,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "per_page": {
                      "default": 30,
                      "maximum": 100,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "pull_number": {
                      "description": "Pull request number.",
                      "maximum": 9007199254740991,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "repo": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "owner",
                    "repo",
                    "pull_number",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "generate_ticket_dependency_tree",
                "description": "Generate a Mermaid flowchart that visualises Jira issue dependency links for a project. Each node shows the ticket key, summary, and status, and is a clickable link to the ticket. Dashed nodes represent issues linked from outside the current filter set.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "assignee": {
                      "description": "Filter by assignee — Jira account ID, display name, or 'currentUser()'.",
                      "type": "string"
                    },
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "minLength": 1,
                      "type": "string"
                    },
                    "colorMode": {
                      "default": "light",
                      "description": "Color scheme for the diagram: 'light' (default pastel fills), 'dark' (deep fills for dark backgrounds), or 'none' (no fill/stroke overrides, inherits the Mermaid theme).",
                      "enum": [
                        "light",
                        "dark",
                        "none"
                      ],
                      "type": "string"
                    },
                    "createdAfter": {
                      "description": "Include only issues created on or after this date, ISO format: '2024-01-15'.",
                      "type": "string"
                    },
                    "createdBefore": {
                      "description": "Include only issues created on or before this date, ISO format: '2024-03-31'.",
                      "type": "string"
                    },
                    "maxResults": {
                      "default": 50,
                      "description": "Target number of issues to render in the tree (1–100, default 50).",
                      "maximum": 100,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "projectKey": {
                      "description": "REQUIRED: Jira project key, e.g. 'PROJ' or 'MYTEAM'. Used as the base JQL project filter.",
                      "minLength": 1,
                      "type": "string"
                    },
                    "reporter": {
                      "description": "Filter by reporter — Jira account ID or display name.",
                      "type": "string"
                    },
                    "sprint": {
                      "description": "Filter by sprint name or numeric ID, e.g. 'Sprint 12' or '42'.",
                      "type": "string"
                    },
                    "status": {
                      "description": "Filter by issue status, e.g. 'In Progress', 'To Do', 'Done'.",
                      "type": "string"
                    },
                    "useUrlShortener": {
                      "default": true,
                      "description": "Shorten the preview/edit URL via Short.io. Disable to get the full unshortened URL (default true).",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "projectKey",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "generate_jira_kanban_board",
                "description": "Generate a Mermaid kanban board from Jira issues. Issues are grouped into columns by their current status and ordered by workflow stage (To Do → In Progress → Done). Each card shows the issue summary and is a clickable link to the ticket, with optional assignee and priority badges.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "assignee": {
                      "description": "Filter by assignee — Jira account ID, display name, or 'currentUser()'.",
                      "type": "string"
                    },
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "minLength": 1,
                      "type": "string"
                    },
                    "issueType": {
                      "description": "Filter by issue type, e.g. 'Story', 'Bug', 'Task'.",
                      "type": "string"
                    },
                    "maxResults": {
                      "default": 50,
                      "description": "Maximum number of issues to fetch (1–100, default 50).",
                      "maximum": 100,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "projectKey": {
                      "description": "REQUIRED: Jira project key, e.g. 'PROJ' or 'MYTEAM'.",
                      "minLength": 1,
                      "type": "string"
                    },
                    "sprint": {
                      "description": "Filter by sprint name or numeric ID, e.g. 'Sprint 12' or '42'.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "projectKey",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "generate_ticket_diagram",
                "description": "Generate a Mermaid flowchart centred on a single Jira ticket. Fetches the ticket's subtasks, parent, issue links, and recent comments in one call. The focal ticket is highlighted in indigo; subtasks are grouped in a subgraph; issue links use colour-coded arrows (red thick = blocks, cyan dashed = relates to); comments appear in a rose subgraph.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "minLength": 1,
                      "type": "string"
                    },
                    "colorMode": {
                      "default": "light",
                      "description": "Color scheme for the diagram: 'light' (default pastel fills), 'dark' (deep fills for dark backgrounds), or 'none' (no fill/stroke overrides, inherits the Mermaid theme).",
                      "enum": [
                        "light",
                        "dark",
                        "none"
                      ],
                      "type": "string"
                    },
                    "ticketKey": {
                      "description": "REQUIRED: Jira issue key, e.g. 'MC-123' or 'PROJ-42'.",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "ticketKey",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "generate_ticket_timeline",
                "description": "Generate a Mermaid diagram showing the history of a single Jira ticket using its changelog. Two views are available:\n- **state**: stateDiagram-v2 showing all status transitions with dates and authors, nodes coloured by status category.\n- **timeline** (default): Mermaid timeline grouped by month, showing status changes, assignee changes, priority changes, sprint moves, and resolutions.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "minLength": 1,
                      "type": "string"
                    },
                    "ticketKey": {
                      "description": "REQUIRED: Jira issue key, e.g. 'MC-123' or 'PROJ-42'.",
                      "minLength": 1,
                      "type": "string"
                    },
                    "view": {
                      "default": "timeline",
                      "description": "Diagram view to generate. 'state' shows status transitions; 'timeline' shows all field changes over time.",
                      "enum": [
                        "state",
                        "timeline"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "ticketKey",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "get_notion_page_mermaid_diagrams",
                "description": "Extract all Mermaid code blocks from a Notion page. Returns block ID, diagram code, and optional caption for each block.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "pageUrl": {
                      "description": "URL of the Notion page (e.g. https://www.notion.so/My-Page-abc123...).",
                      "format": "uri",
                      "type": "string"
                    }
                  },
                  "required": [
                    "pageUrl",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "get_notion_mermaid_diagram_by_block_id",
                "description": "Retrieve a single Mermaid diagram block by its block ID. Returns the diagram code and optional caption.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "blockId": {
                      "description": "The Notion block ID of the mermaid code block (e.g. from get_notion_page_mermaid_diagrams).",
                      "type": "string"
                    },
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "blockId",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": true
                }
              },
              {
                "name": "update_notion_mermaid_diagram",
                "description": "Update the Mermaid source code (and optional caption) of an existing mermaid code block by its block ID.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "blockId": {
                      "description": "The Notion block ID of the mermaid code block to update.",
                      "type": "string"
                    },
                    "caption": {
                      "description": "Optional new caption. Omit to clear the existing caption.",
                      "type": "string"
                    },
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "code": {
                      "description": "New Mermaid diagram source code.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "blockId",
                    "code",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": false
                }
              },
              {
                "name": "insert_notion_mermaid_diagram",
                "description": "Append a Mermaid diagram as a code block to a Notion page. The block is added at the end of the page content.",
                "inputSchema": {
                  "$schema": "http://json-schema.org/draft-07/schema#",
                  "properties": {
                    "caption": {
                      "description": "Optional caption displayed below the code block.",
                      "type": "string"
                    },
                    "clientName": {
                      "description": "REQUIRED: The name of the client/agent using the MCP server for analytics tracking.",
                      "type": "string"
                    },
                    "code": {
                      "description": "Mermaid diagram source code.",
                      "type": "string"
                    },
                    "pageUrl": {
                      "description": "URL of the Notion page to insert the diagram into.",
                      "format": "uri",
                      "type": "string"
                    }
                  },
                  "required": [
                    "pageUrl",
                    "code",
                    "clientName"
                  ],
                  "type": "object"
                },
                "annotations": {
                  "readOnlyHint": false
                }
              }
            ],
            "schemaTokens": 6198,
            "changedAt": "2026-09-30T21:57:02.278667952Z",
            "check": {
              "checker": "anchor-check/1.0",
              "totalTokens": 6198,
              "counts": {
                "error": 0,
                "note": 1,
                "warn": 11
              },
              "findings": [
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "create_issue",
                  "message": "3 parameters without a description: owner, repo, title",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "create_pr",
                  "message": "3 parameters without a description: owner, repo, title",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "get_issue_comments",
                  "message": "4 parameters without a description: owner, page, per_page, repo",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "get_pull_comments",
                  "message": "4 parameters without a description: owner, page, per_page, repo",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "list_branches",
                  "message": "2 parameters without a description: owner, repo",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "list_issues",
                  "message": "7 parameters without a description: direction, owner, page, per_page, repo, sort and 1 more",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "list_pulls",
                  "message": "5 parameters without a description: owner, page, per_page, repo, state",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "list_repos",
                  "message": "2 parameters without a description: page, per_page",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "push_file",
                  "message": "3 parameters without a description: owner, path, repo",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC11",
                  "severity": "warn",
                  "tool": "read_mermaid_file",
                  "message": "2 parameters without a description: owner, repo",
                  "fix": "Describe each one: format, units, an example, and what happens when it's left out."
                },
                {
                  "rule": "TC21",
                  "severity": "warn",
                  "tool": "list_pulls",
                  "message": "described almost the same as list_issues (82% of the same words)",
                  "fix": "Say in each description when to use it instead of the other."
                },
                {
                  "rule": "TC24",
                  "severity": "note",
                  "message": "25 of 25 tools have no outputSchema",
                  "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
                }
              ]
            }
          },
          "updatedAt": "2026-10-05T00:15:26.296682725Z"
        }
      }
    ]
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/categories/diagramming",
    "json": "https://www.anchorterminal.com/categories/diagramming.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/categories/diagramming.md",
    "slim": "https://www.anchorterminal.com/categories/diagramming.min.md"
  },
  "markdown": "Tools an agent can use to draw architecture, flow and sequence diagrams, through a REST API, an MCP server, an SDK or a diagram-as-code format. Compared on how the diagram is described, whether it stays editable, export formats and what it costs.\n\n- Tools ranked: 10 · agent-ready (BB or better): 0 · accept x402: 0 · hosted endpoints: 10 · desk reviews by the panel: 20\n- JSON: https://www.anchorterminal.com/api/v1/tools.json (list) · https://www.anchorterminal.com/api/v1/rankings.json (ranked) · https://www.anchorterminal.com/api/v1/x402.json (payable) · https://www.anchorterminal.com/api/v1/capabilities.json (by capability)\n- Grades run AA, A, BB, B, C, D, E, F · methodology: https://www.anchorterminal.com/benchmark/\n\n- Capabilities in this category: diagram.create, diagram.as-code, diagram.edit, diagram.export, diagram.architecture\n- https://letme.dev/diagram.create picks the top-graded tool in this list and says how to call it direct; calling through letme comes later (https://www.anchorterminal.com/letme/index.md)\n\n## Ranking\n\n| # | Tool | Vendor | Kind | Category | Grade | Score | Confidence | x402 | Auth | Where | Reviews | Page |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| 175 | Miro API + MCP | Miro | HTTP API | Design | B | 65.3 | medium | no | OAuth | hosted | 4/5 (2) | https://www.anchorterminal.com/tools/miro.md |\n| 219 | draw.io + MCP | draw.io | MCP server | Diagrams | B | 62.4 | medium | no | None | hosted + local | 4/5 (2) | https://www.anchorterminal.com/tools/drawio.md |\n| 236 | tldraw SDK + MCP | tldraw | SDK + MCP | Diagrams | C | 61 | medium | no | None | hosted | 3/5 (2) | https://www.anchorterminal.com/tools/tldraw.md |\n| 238 | Lucid API + MCP | Lucid Software | HTTP API | Diagrams | C | 60.9 | medium | no | OAuth or key | hosted | 3/5 (2) | https://www.anchorterminal.com/tools/lucid.md |\n| 252 | Structurizr + MCP | Structurizr | HTTP API | Diagrams | C | 60.2 | medium | no | OAuth or key | hosted | 3/5 (2) | https://www.anchorterminal.com/tools/structurizr.md |\n| 255 | Diagrams.so API + MCP | Diagrams.so (RedHold LLC) | HTTP API | Diagrams | C | 60.1 | medium | no | OAuth or key | hosted + local | 4/5 (2) | https://www.anchorterminal.com/tools/diagrams-so.md |\n| 341 | Whimsical MCP | Whimsical | MCP server | Diagrams | D | 52.7 | medium | no | OAuth | hosted | 3/5 (2) | https://www.anchorterminal.com/tools/whimsical.md |\n| 427 | Eraser API + MCP | Eraser | HTTP API | Diagrams | E | 38.7 | medium | no | OAuth or key | hosted + local | 3/5 (2) | https://www.anchorterminal.com/tools/eraser.md |\n| 432 | Cloudviz API | Cloudviz | HTTP API | Diagrams | F | 37.9 | medium | no | API key | hosted | 2.5/5 (2) | https://www.anchorterminal.com/tools/cloudviz.md |\n| 442 | Mermaid Chart MCP | Mermaid Chart | MCP server | Diagrams | F | 31.7 | medium | no | OAuth or key | hosted | 2.5/5 (2) | https://www.anchorterminal.com/tools/mermaid-chart.md |\n\nScores are from public evidence against the published checklist (https://www.anchorterminal.com/benchmark/), with Performance and Task success pending. p95 latency and context cost come from our probes, which haven't run yet.\n\n## Summaries\n\n### 175. Miro API + MCP, B (65.3)\n\nMiro's REST API v2 reads and writes boards and board items (sticky notes, shapes, connectors, frames, cards, text, images, documents), tags and members, so an agent can lay out diagrams as well as notes. REST creates shapes, connectors and frames, so flowcharts and architecture sketches can be drawn directly. Legacy MCP board tools were removed nine days after the deprecation notice.\n\n- Page: https://www.anchorterminal.com/tools/miro · Markdown: https://www.anchorterminal.com/tools/miro.md · JSON: https://www.anchorterminal.com/api/v1/tools/miro.json\n- Capabilities: design.files, design.canvas, design.comments, diagram.create, diagram.edit · endpoint: `https://api.miro.com/v2`\n\n### 219. draw.io + MCP, B (62.4)\n\nThe open-source diagram editor (also diagrams.net) with an official MCP server. Free, keyless and Apache 2.0, with a Docker image for self-hosting. Tool descriptions embed a 34.5 KB XML reference and a 14 KB Mermaid reference, roughly 13,000 tokens.\n\n- Page: https://www.anchorterminal.com/tools/drawio · Markdown: https://www.anchorterminal.com/tools/drawio.md · JSON: https://www.anchorterminal.com/api/v1/tools/drawio.json\n- Capabilities: diagram.create, diagram.as-code, diagram.edit, diagram.export, diagram.architecture · endpoint: `https://mcp.draw.io/mcp`\n\n### 236. tldraw SDK + MCP, C (61)\n\nA React infinite-canvas SDK that an agent can drive through the editor API, creating, reading and changing shapes, turning Mermaid into shapes and exporting images. Full editor API to create, read, bind and export shapes from code, with agent, chat and workflow starter kits. Source-available, and commercial prices aren't published.\n\n- Page: https://www.anchorterminal.com/tools/tldraw · Markdown: https://www.anchorterminal.com/tools/tldraw.md · JSON: https://www.anchorterminal.com/api/v1/tools/tldraw.json\n- Capabilities: diagram.create, diagram.as-code, diagram.edit, diagram.export · endpoint: `https://tldraw-mcp-app.tldraw.workers.dev/mcp`\n\n### 238. Lucid API + MCP, C (60.9)\n\nREST API and hosted MCP server for creating, reading and managing Lucidchart and Lucidspark diagrams. OAuth 2.0 scopes with `:readonly` variants, and audit log endpoints in the REST API. No public changelog for the API or the MCP server.\n\n- Page: https://www.anchorterminal.com/tools/lucid · Markdown: https://www.anchorterminal.com/tools/lucid.md · JSON: https://www.anchorterminal.com/api/v1/tools/lucid.json\n- Capabilities: diagram.create, diagram.as-code, diagram.edit, diagram.export, design.files, design.canvas, design.comments · endpoint: `https://api.lucid.co`\n\n### 252. Structurizr + MCP, C (60.2)\n\nDiagram-as-code tool for software architecture using the C4 model. One model can generate several C4 architecture views. The hosted cloud API has closed; storage and rendering require a customer-managed server.\n\n- Page: https://www.anchorterminal.com/tools/structurizr · Markdown: https://www.anchorterminal.com/tools/structurizr.md · JSON: https://www.anchorterminal.com/api/v1/tools/structurizr.json\n- Capabilities: diagram.create, diagram.as-code, diagram.edit, diagram.export, diagram.architecture · endpoint: `https://mcp.structurizr.com/mcp`\n\n### 255. Diagrams.so API + MCP, C (60.1)\n\nTurns a plain-English description into an editable draw.io diagram with cloud icons (AWS, Azure, GCP, OCI, Kubernetes). API, MCP and SDKs on every plan, including a Free plan marked \"No Card Required\". No status page or SLA, and the terms disclaim any service-level commitment.\n\n- Page: https://www.anchorterminal.com/tools/diagrams-so · Markdown: https://www.anchorterminal.com/tools/diagrams-so.md · JSON: https://www.anchorterminal.com/api/v1/tools/diagrams-so.json\n- Capabilities: diagram.create, diagram.edit, diagram.export, diagram.architecture · endpoint: `https://api.diagrams.so/api/v2`\n\n### 341. Whimsical MCP, D (52.7)\n\nOfficial hosted MCP server for the Whimsical workspace. OAuth 2.1 with PKCE and separate read and write scopes. No API keys, so it can't run headless or in CI.\n\n- Page: https://www.anchorterminal.com/tools/whimsical · Markdown: https://www.anchorterminal.com/tools/whimsical.md · JSON: https://www.anchorterminal.com/api/v1/tools/whimsical.json\n- Capabilities: diagram.create, diagram.edit, diagram.export · endpoint: `https://mcp.whimsical.com/mcp`\n\n### 427. Eraser API + MCP, E (38.7)\n\nDocs and diagrams workspace for engineers. Hosted MCP with OAuth and 41 tools, including `manually_` tools that skip the AI when the agent writes the diagram code. No status page, rate limits, SLA or changelog.\n\n- Page: https://www.anchorterminal.com/tools/eraser · Markdown: https://www.anchorterminal.com/tools/eraser.md · JSON: https://www.anchorterminal.com/api/v1/tools/eraser.json\n- Capabilities: diagram.create, diagram.as-code, diagram.edit, diagram.export, diagram.architecture · endpoint: `https://app.eraser.io/api`\n\n### 432. Cloudviz API, F (37.9)\n\nGenerates AWS architecture diagrams from a live account. Diagrams come from the live AWS account through a read-only cross-account role with a per-customer external ID. AWS only, and API access starts at the $49 a month Team plan.\n\n- Page: https://www.anchorterminal.com/tools/cloudviz · Markdown: https://www.anchorterminal.com/tools/cloudviz.md · JSON: https://www.anchorterminal.com/api/v1/tools/cloudviz.json\n- Capabilities: diagram.create, diagram.export, diagram.architecture · endpoint: `https://api.cloudviz.io`\n\n### 442. Mermaid Chart MCP, F (31.7)\n\nHosted MCP server for Mermaid diagrams from mermaid.ai. Validation and rendering work with no account or key. Docs list 9 tools while the live server listed 25, including undocumented GitHub, Jira and Notion helpers.\n\n- Page: https://www.anchorterminal.com/tools/mermaid-chart · Markdown: https://www.anchorterminal.com/tools/mermaid-chart.md · JSON: https://www.anchorterminal.com/api/v1/tools/mermaid-chart.json\n- Capabilities: diagram.create, diagram.as-code, diagram.edit, diagram.export · endpoint: `https://mcp.mermaid.ai/mcp`\n\n## Indexed, not reviewed (6)\n\nSorted into this category from public catalogues, with facts and our own checks but no score, grade or rank (https://www.anchorterminal.com/indexed/index.md).\n\n| Listing | Kind | What it does | Why it's here |\n| --- | --- | --- | --- |\n| [chartforge](https://www.anchorterminal.com/tools/chartforgeai-chartforge.md) | MCP server | MCP server for ChartForge — generate stunning charts and diagrams from natural language | vendor's own |\n| [DiagramZu](https://www.anchorterminal.com/tools/diagramzu-mcp.md) | MCP server | Let Claude, Cursor, or ChatGPT author Mermaid diagrams your team can read and share. | vendor's own |\n| [DrillFlow](https://www.anchorterminal.com/tools/drillflow-mcp.md) | MCP server | Publish drill-down diagrams from an agent; every Mermaid subgraph becomes a level you enter. | vendor's own |\n| [Flowgraf](https://www.anchorterminal.com/tools/flowgraf.md) | MCP server | Create and edit architecture diagrams from your AI agent; get an SVG and a live editable canvas. | vendor's own |\n| [noddle draw](https://www.anchorterminal.com/tools/noddle-draw.md) | MCP server | Read, create and edit open-source noddle draw diagram boards, browse versions and comment. | vendor's own |\n| [vgraph-mcp](https://www.anchorterminal.com/tools/vithanco-vgraph-mcp.md) | MCP server | Concept Maps, IBIS, Causal Loop Diagrams and Timelines as images. Runs locally via WebAssembly. | vendor's own |\n\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Diagramming",
        "url": ""
      }
    ],
    "description": "10 diagramming listings ranked by the Anchor benchmark. Leader Miro API + MCP (B). Tools an agent can use to draw architecture, flow and sequence diagrams, through a REST API, an MCP server, an SDK or a diagram-as-code format. Compared on how the diagram is described, whether it stays editable, export formats and what it costs.",
    "facts": [
      "Miro API + MCP B",
      "draw.io + MCP B",
      "tldraw SDK + MCP C"
    ],
    "h1": "Diagramming APIs and diagram-as-code for AI agents",
    "image": "https://www.anchorterminal.com/assets/og/categories-diagramming.png",
    "path": "/categories/diagramming",
    "published": "",
    "section": "tools",
    "title": "Diagramming APIs and diagram-as-code for AI agents, ranked",
    "toc": null,
    "updated": "2026-10-05",
    "url": "https://www.anchorterminal.com/categories/diagramming"
  },
  "tokens": {
    "markdown": 2850,
    "slim": 530
  },
  "version": 1
}
