Use this skill to generate Azure architecture diagrams in .drawio format via the simonkurtz-MSFT MCP server (700+ Azure icons, batch creation, transactional mode). Covers architecture diagrams, dependency diagrams, runtime flow diagrams, and as-built diagrams. Do NOT use for WAF/cost charts (use python-diagrams), inline Mermaid (use mermaid), or Excalidraw diagrams (use excalidraw).
94
92%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Advisory
Suggest reviewing before use
Generate Azure architecture diagrams in .drawio format using the
simonkurtz-MSFT Draw.io MCP server. The server has 700+ built-in Azure icons,
fuzzy shape search, batch operations, group/layer/page management, and
transactional mode for efficient multi-step workflows.
Authoritative reference: The MCP server's own src/instructions.md (519 lines) is the
canonical guide for tool parameters, layout rules, and workflow patterns.
It is automatically sent to the MCP client at startup via the server's
instructions field — agents receive it in context without needing to read it.
This skill provides project-specific conventions that complement (not duplicate) it.
simonkurtz-MSFT/drawio-mcp-server (Deno, stdio) configured in .vscode/mcp.jsonghcr.io/devcontainers-community/features/denohediet.vscode-drawio for in-editor previewUse the MCP server's startup instructions as the authoritative tool reference. This skill only captures the repo-specific sequence and guardrails that must stay consistent across generated diagrams.
search-shapes — resolve all Azure icons up front in one batchcreate-groups — create VNets, subnets, resource groups, or app environmentsadd-cells — add all vertices and edges in one batch using shape_name and temp_idadd-cells-to-group — assign all children to groups in one batchfinish-diagram or export-diagram — emit final XML with compress: trueFor reusable call patterns, see references/azure-patterns.md.
Icons are resolved automatically by the MCP server from its built-in library
(700+ Azure icons from assets/azure-public-service-icons/).
shape_name in add-cells to specify Azure icons (e.g., shape_name: "Front Doors")width, height, or style when using shape_name —
the server auto-applies correct dimensions and stylingsearch-shapes with a queries array to find icon names by fuzzy matchtext label or omit text entirely — never pass text: ""For simple diagrams or single operations. Each tool call returns full XML with complete SVG image data.
search-shapes → add-cells → export-diagram(compress: true) → save .drawioFor any multi-step diagram. Intermediate responses use lightweight placeholders
(~2KB instead of ~200KB). Real SVGs are resolved once at the end via finish-diagram.
search-shapes
→ create-groups(transactional: true)
→ add-cells(transactional: true)
→ add-cells-to-group(transactional: true)
→ edit-cells(transactional: true) [if needed]
→ finish-diagram(compress: true) [resolves all placeholders]
→ save .drawio via terminal commandCRITICAL: When using transactional mode, you MUST call finish-diagram
at the end. Without it, the diagram contains placeholder shapes instead of real icons.
.drawio FilesWhen finish-diagram or export-diagram returns XML in a JSON response, use
the helper script to decompress, strip edge anchors, and save in one step:
python3 tools/scripts/save-drawio.py '<temp-content-json-path>' '<output-path>.drawio'
node tools/scripts/validate-drawio-files.mjs '<output-path>.drawio'The script handles: compressed content decompression, mxGraphModel embedding
(repo validator format), edge anchor/waypoint stripping, and directory creation.
Do NOT read the large MCP JSON response back through the LLM — extract data via terminal commands to avoid inflating the context window.
Every tool that accepts an array MUST be called exactly ONCE with ALL items. Never call a tool repeatedly for individual items.
search-shapes — ONE call with ALL queries in the queries array (main flow + cross-cutting)create-groups — ONE call with ALL groups. Set text: "" for groups; create separate text vertex above.add-cells — ONE call with ALL vertices AND edges. Vertices before edges.
Use temp_id for cross-refs, shape_name for icons.add-cells-to-group — ONE call with ALL assignments. Server auto-converts absolute → group-relative coords.edit-cells/edit-edges — ONE call if adjustments needed.finish-diagram (transactional) or export-diagram (default) — with compress: true.After group assignments, call validate-group-containment to detect any children that exceed group bounds.
diagram_xml from the previous call's response on every subsequent call.
Save the XML to a temp file between steps and read it back rather than
inflating the LLM context with the full XML in every turn.For multi-step flow explanations (common in Microsoft reference architectures),
use circled Unicode numbers as small text vertices placed near the relevant
icon or edge: ①②③④⑤⑥⑦⑧⑨⑩. Style them with fontSize=11;fontColor=#CC0000;fontStyle=1
so they stand out as red bold callouts without cluttering the diagram.
For on-premises, external, or third-party services that don't have Azure icons, use a yellow-tinted rectangle to visually distinguish them from Azure resources:
shape=mxgraph.basic.rect;fillColor=#FFF9E6;strokeColor=#D4A017;rounded=1;
fontSize=10;fontColor=#8B6914;whiteSpace=wrap;Examples: on-premises DNS servers, hosted public DNS, external partner systems, client apps, CI/CD pipelines.
text: "" for groups — create a separate bold text vertex above the group instead.suggest-group-sizing to calculate dimensions based on child count.edgeStyle=orthogonalEdgeStyle (the default).entryX, entryY, exitX, exitY in your edge style.<Array as="points"> or <mxPoint> elements.temp_id), not the parent group/subnet cell ID, because the orthogonal
router calculates the path through every intervening group boundary between
source and target — creating messy vertical corridors and label collisions.CRITICAL — Post-Processing Required: The MCP server's auto-router injects
exitX/exitY/entryX/entryYanchor points and<Array>waypoints into every edge it creates. These computed routes are poor for fan-out patterns and cause edges to pile up in horizontal corridors. Afterfinish-diagram, the agent MUST runtools/scripts/save-drawio.pywhich strips these injected anchors and waypoints, letting Draw.io's client-side renderer calculate clean orthogonal paths when the file is opened.
Place Azure Monitor, Entra ID, Key Vault, Azure Policy, Defender for Cloud, Container Registry, DNS Zones, Application Insights, Log Analytics at the bottom of the diagram, 120px below the main flow. No edges to them. Space 120px apart (center-to-center) — labels like "Application Insights" and "Private DNS Zones" need this width. Wrap into multiple rows at page width.
Enclose all cross-cutting icons in a single light-grey rounded container
(fillColor=#F5F5F5;strokeColor=#BDBDBD) with a bold Azure-blue heading
("Cross-cutting platform services") inside at the top.
Every diagram MUST include a legend. Place it in a horizontal bar below the cross-cutting services box (not beside it — side-by-side causes overlap).
<font color="#0078D4"><b>━━▶</b></font> Data flow (HTTPS / TLS)add-cells, always set text: ""
explicitly — the MCP server defaults to "New Cell" which renders as visible text.After save-drawio.py, run the cleanup script to fix known MCP artifacts:
python3 .github/skills/drawio/scripts/cleanup-drawio.py '<output-path>.drawio'The script fixes:
value="New Cell" → value="" (MCP default for vertices without explicit text)Use the Azure-aligned color palette from get-style-presets and the style
examples in references/style-reference.md. Standard output filenames and the
validation checklist live in references/validation-checklist.md.
text: "" breaks shapes — Every shaped vertex MUST have a text
label or omit text entirely. NEVER pass text: "" (empty string).shape_name — Do NOT pass width,
height, or style when using shape_name — the MCP server auto-applies
correct dimensions. Specifying these breaks icon rendering.finish-diagram — When using
transactional: true, MUST call finish-diagram at the end. Without it,
diagram contains ~2KB placeholder shapes instead of real SVG icons.entryX, entryY,
exitX, exitY in edge style. Do not add <Array as="points"> or
<mxPoint> elements.| File | Purpose |
|---|---|
references/style-reference.md | Draw.io style properties for AI-generated files |
references/azure-patterns.md | Reusable MCP tool call patterns for Azure architectures |
references/validation-checklist.md | Validation rules for AI-generated .drawio files |
references/abstraction-rules.md | Diagram abstraction and data-flow clarity rules |
references/iac-to-diagram.md | Generate diagrams from Bicep/Terraform/ARM templates |
| File | Pattern |
|---|---|
examples/azure-vm-baseline-architecture.drawio | VM baseline — VNet + 6 subnets, vertical flow, legend |
examples/azure-aks-microservices.drawio | AKS microservices — horizontal flow, namespaces, CI/CD |
examples/azure-dns-private-resolver.drawio | DNS Private Resolver — hub-spoke, numbered callouts |
examples/azure-foundry-landing-zone.drawio | Foundry Chat — landing zone, multi-subscription |
examples/azure-vm-baseline-architecture.svg | Source SVG from Microsoft Learn (reference comparison) |
Also see: tmp/azure-architecture-example.drawio, tmp/03-des-diagram.svg
ec7b8ff
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.