arch-diagram-mcp
Diagrams existing Google Cloud infrastructure by importing a Cloud Asset Inventory export, producing architecture diagrams with the real resource names and details (database version, machine type, ingress setting), with optional project, region and label filtering, plus bundled GCP reference templates (GKE microservices, serverless and data platform).
Provides official provider icon sets and templates for Kubernetes workloads, such as the GKE and AKS microservices reference architectures, so containerized services can be rendered in diagrams.
Includes NGINX icons so on-prem and SaaS proxy/web services can be depicted in generated architecture diagrams.
Includes PostgreSQL icons so database nodes can be placed and rendered in generated architecture diagrams.
Includes Redis icons so cache/data nodes can be placed and rendered in generated architecture diagrams, and review rules consider cache layers.
Builds architecture diagrams from [terraform](/mcp/servers/integrations/terraform) show -json output (plan or state) or raw .tfstate files, mapping ~140 AWS/Azure/GCP resource types to nodes, nesting VPC/VNet, subnet, resource group and Container Apps boundaries into clusters, deriving edges from resource references and module outputs, and reporting unmapped types.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@arch-diagram-mcpcreate an AWS three-tier architecture diagram with ALB, EC2, and RDS and review it"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Architecture Diagram MCP Server
arch-diagram-mcp is an MCP server that generates, reviews and imports cloud architecture diagrams for
AWS, Azure and Google Cloud. It uses the official provider icons, about 1,800 in all, including
Kubernetes, on-prem and SaaS services such as PostgreSQL, Redis, Kafka and Nginx. Diagrams render
through Graphviz to PNG, self-contained SVG, PDF or JPG.
You can design new architectures, or diagram what already exists: from Terraform, or straight from a running Google Cloud project's own inventory, with the real resource names, however it was created.
Quick start. Install Graphviz, then add the server to your MCP client with any of these:
From | Command |
PyPI, with uv |
|
PyPI, with pipx |
|
npm (launches the PyPI package through uv or pipx) |
|
For example, in Claude Code: claude mcp add architecture-diagrams -s user -- uvx arch-diagram-mcp.
It is also listed in the MCP Registry as
io.github.apatilgtn/architecture-diagrams.
Using it as a developer? Start with the developer guide. It covers connecting Claude Code, VS Code, Cursor or Claude Desktop, on your machine or to a shared team server, and gives example prompts. The rest of this README is for running and configuring the server.
Samples
These are the bundled templates and the Terraform example, rendered exactly as the server produces them.
The score is from review_architecture. Click a diagram for the full-size image.
To regenerate them, run python scripts/render_samples.py.
The server has also been tested end to end on Google Cloud: a private bucket with signed URLs, and a private Cloud Run service with two layers of auth. See docs/CLOUD_TESTING.md for how it was tested, what was checked and the bug it found.
Related MCP server: aws-architecture-scanner
Tools
Tool | What it does |
| Ranked icon search by service name or alias ( |
| Lists every category and service for a provider |
| Returns bundled reference architectures as editable specs |
| Checks a spec without rendering: icon ids (with suggestions), references, nesting cycles, limits |
| Renders the diagram; returns file paths, a JSON summary and an inline PNG preview |
| Runs a heuristic Well-Architected review and returns a 0–100 score, a grade and findings with recommendations |
| Builds a diagram from |
| Builds a diagram of resources already running in Google Cloud from a Cloud Asset Inventory export, with real names |
| Reports the version, Graphviz status, icon count, output directory and limits |
There is also one prompt, design_architecture(provider, workload, requirements). It walks the model
through choosing a template, searching icons, validating, rendering and reviewing.
Bundled templates
aws_three_tieraws_serverless_event_drivenazure_webapp_hub_spokeazure_aks_microservicesgcp_serverless_datagcp_gke_microservices
Every template is tested to validate, to render, and to have no critical- or high-severity review findings.
Diagram spec
{
"title": "My App",
"direction": "LR",
"theme": "light",
"output_formats": ["png", "svg"],
"clusters": [{"id": "vpc", "label": "VPC 10.0.0.0/16"}, {"id": "app", "label": "Private subnet", "parent": "vpc"}],
"nodes": [{"id": "api", "type": "aws.compute.ECS", "label": "orders-api", "cluster": "app"}],
"edges": [{"source": "alb", "target": "api", "label": "HTTPS", "style": "dashed"}]
}Review rules
Pillar | Rules |
Security | Internet → data store (critical); internet → compute without a gateway (high); no WAF; no secrets/KMS; no identity provider; data stores outside a network boundary; no egress control |
Reliability | VM without a load balancer; single region; no backup; deep synchronous call chains |
Operational Excellence | No monitoring; no CI/CD; unconnected components |
Performance Efficiency | No CDN for public traffic; no cache layer |
The rules only see what the diagram shows. Treat findings as review prompts, not proof of a misconfiguration.
Terraform import
terraform show -json plan.out > plan.json gives the best result, because the plan includes the
configuration's references.
Mapped resources: about 140 AWS, Azure and GCP resource types become nodes.
Boundaries: VPC/VNet, subnet, resource group and Container Apps environment resources become nested clusters. Nodes are placed in the most specific boundary they reference, either directly or through a NIC.
Edges: references between resources become edges, and module outputs are resolved.
Inferred edges: links that pass through plumbing resources become dashed edges, oriented edge → compute → messaging → data. Plumbing resources include listeners, target groups, NICs, role assignments, Front Door origins and backend services.
Unmapped types: the result lists them, so you can see what was left out.
Inventory import (Google Cloud)
For infrastructure that is already running, however it was created (console, gcloud, scripts,
Terraform, Pulumi), export the project's inventory and pass it to diagram_from_inventory:
gcloud asset list --project <project-id> --content-type resource \
--asset-types "$(arch-diagram-mcp --gcp-asset-types)" --format json > assets.json--gcp-asset-types prints the 54 asset types the importer uses. Asking only for those keeps the
export small: a test project went from 4.4 MB to 535 KB with the same diagram. The caller needs
roles/cloudasset.viewer and the Cloud Asset API enabled.
Names: every node keeps its real name. A second line adds detail, such as the database version, machine type, ingress setting, replica count or cron schedule.
Boundaries: Project › VPC › Subnet › GKE cluster › Namespace. Shared VPC networks owned by another project are drawn under that project. Cloud Run with direct VPC egress sits in its subnet.
Edges from configuration:
Cloud SQL, secret, KMS, Pub/Sub, bucket and Redis references in annotations and environment variables;
URLs matched to the Cloud Run service or function that owns them (push subscriptions, Scheduler targets, env vars);
the load balancer chain (forwarding rule › proxy › URL map › backend › NEG, bucket or MIG), with path rules, CDN and Cloud Armor;
Eventarc triggers, dead-letter topics, BigQuery and Cloud Storage subscriptions, VPC connectors.
Noise left out: GKE system namespaces and nodes, MIG member VMs (drawn as one MIG), Cloud Functions' own Run services, build and staging buckets, routes, firewalls and RBAC objects.
Filters:
projectsandregionsare hard limits.labels(for example{"app": "payments"}) selects resources plus the ones they connect to (include_neighbors, on by default).Limits: calls that exist only in application code can't be seen. The result returns the spec, so you can add those edges and re-render. External hosts found in env vars are listed in
external_hosts.
Accepted formats: gcloud asset list JSON (recommended), gcloud asset export newline-delimited
JSON, and gcloud asset search-all-resources --read-mask='*' JSON. Azure Resource Graph and AWS
inventories are planned.
Install
Requires Python 3.11+ and Graphviz.
winget install Graphviz.Graphviz # Linux: apt install graphviz macOS: brew install graphviz
python -m venv .venv
.venv\Scripts\python -m pip install -e ".[dev]"
.venv\Scripts\python -m pytest # 85 testsRegister with Claude Code (stdio)
claude mcp add architecture-diagrams -s user `
-e ARCH_DIAGRAM_OUTPUT_DIR=C:\Devops-Projects\Architecture-diagram-mcp\output `
-- C:\Devops-Projects\Architecture-diagram-mcp\.venv\Scripts\python.exe -m arch_diagram_mcpRun as a shared HTTP service
docker build -t arch-diagram-mcp:1.2.0 .
docker run -d -p 8000:8000 -v diagrams:/data \
-e ARCH_DIAGRAM_AUTH_TOKENS="ci=$(openssl rand -hex 32),platform-team=$(openssl rand -hex 32)" \
-e ARCH_DIAGRAM_PUBLIC_BASE_URL=https://diagrams.internal.example.com \
-e ARCH_DIAGRAM_URL_SIGNING_KEY=$(openssl rand -hex 32) \
-e ARCH_DIAGRAM_ALLOWED_HOSTS="diagrams.internal.example.com:*" \
arch-diagram-mcp:1.2.0Clients connect to https://<host>/mcp with Authorization: Bearer <token>. GET /healthz is
unauthenticated and works as a probe. The server runs stateless, so it scales horizontally behind a
load balancer. All replicas must share ARCH_DIAGRAM_URL_SIGNING_KEY so any replica can serve any link.
Authentication
Mode | Set | Identity in audit logs | Roles |
|
| the token's name | Full access |
|
|
|
|
Token mode. Several named tokens can be active at once. To rotate, add the new token, roll out clients, then remove the old one. Each token must be at least 16 characters.
OIDC mode. The server validates JWTs against the issuer's published signing keys (JWKS, found by
discovery or set with ARCH_DIAGRAM_OIDC_JWKS_URI). It checks:
signature (asymmetric algorithms only: no HS*, no
none);issandaud;expandnbf, with 60 s leeway;optional
ARCH_DIAGRAM_OIDC_REQUIRED_SCOPES.
Roles come from the roles claim (Entra app roles) and the scp scope claim:
Reader: search, templates, validate, review.
Author: also render, and import Terraform or cloud inventories. Author implies Reader.
If neither role variable is set, any valid token gets full access.
The server publishes RFC 9728 metadata at /.well-known/oauth-protected-resource, and every 401
response points to it, so MCP clients can discover the authorization server.
Entra ID example:
Register an API app with Application ID URI
api://arch-diagrams.Set
accessTokenAcceptedVersion: 2in its manifest.Add app roles
Diagrams.ReaderandDiagrams.Author, and assign them to groups.Configure the server:
ARCH_DIAGRAM_OIDC_ISSUER=https://login.microsoftonline.com/<tenant-id>/v2.0
ARCH_DIAGRAM_OIDC_AUDIENCE=api://arch-diagrams # v2 tokens may carry the app's client id instead; list both
ARCH_DIAGRAM_READER_ROLE=Diagrams.Reader
ARCH_DIAGRAM_AUTHOR_ROLE=Diagrams.AuthorEntra ID has no dynamic client registration. Clients either use a pre-registered client app, or pass
a token they already hold, e.g. az account get-access-token --resource api://arch-diagrams.
Artifact storage
Over HTTP, responses contain download URLs instead of server file paths:
| Links | Credentials |
|
|
|
| SigV4 presigned GET; objects encrypted with SSE-S3, or SSE-KMS when | Standard AWS chain (IRSA, instance role, env, profile) |
| Read-only, HTTPS-only SAS. Uses a user-delegation key via Entra ID with | Managed / workload identity needs Storage Blob Data Contributor |
| V4 signed URL. Signs locally with a service-account key, or through IAM signBlob under workload identity | Needs Storage Object Creator and Service Account Token Creator |
Object keys:
<prefix>/<yyyy>/<mm>/<dd>/<sha256(caller)[:16]>/<file>. Files are separated per caller, and keys never contain user names.Link lifetime: set by
ARCH_DIAGRAM_URL_TTL_S, default 1 h, maximum 7 days.Cleanup:
ARCH_DIAGRAM_DELETE_LOCAL_AFTER_UPLOAD=trueremoves local copies once a cloud upload succeeds. For cloud objects, use a bucket lifecycle rule.Served SVGs: sent with
Content-Security-Policy: sandboxandnosniff.Terraform paths:
diagram_from_terraform(path=...)is disabled over HTTP, so remote callers can't read server files.
Configuration (environment)
Variable | Default | Purpose |
|
| Where diagrams are written |
| cwd + output dir |
|
| 300 / 800 / 100 | Spec size limits |
| 60 | Graphviz is killed after this many seconds |
| 25 MB | Terraform input size limit |
| 0 (keep forever) | Deletes generated files older than N days |
| true | Keeps the |
| 4 MB | Larger PNGs are returned as a path only |
| auto | Font family; auto picks Segoe UI on Windows, Helvetica Neue on macOS, DejaVu Sans on Linux |
| 144 | PNG/JPG resolution (72–300) |
| INFO | JSON logs go to stderr, one audit line per tool call |
| 127.0.0.1 / 8000 | HTTP bind address and port |
| auto |
|
| – |
|
| – | OIDC validation |
| – | Role names for RBAC (OIDC) |
| – | External URL; used for download links and OAuth metadata |
| local |
|
| – / | Bucket or container, and key prefix |
| – | Backend specifics |
| 3600 | Download-link lifetime (60 s – 7 days) |
| random per process | HMAC key for local links; ≥32 chars; share it across replicas |
| false | Removes local files after a cloud upload |
| – | Comma-separated Host/Origin allow-lists (DNS-rebinding protection) |
| false | Allows a non-loopback bind without a token (only behind an authenticating proxy) |
Security model
Spec validation: ids, colours and styles are pattern-checked, and size limits apply.
Text escaping: titles, node labels and cluster labels are always written as literal strings, never as Graphviz HTML labels. Edge labels are HTML-escaped. A label therefore can't inject DOT statements, such as an
image=attribute that reads local files.Rendering: Graphviz runs as a subprocess with a hard timeout, and partial output is deleted on failure.
Output files: file names are sanitised, timestamped and uniquely suffixed. Retention cleanup only touches files the server generated.
Terraform input: file reads are confined to
ARCH_DIAGRAM_INPUT_ROOTSand size-limited.HTTP:
Static tokens are compared in constant time against every configured token.
OIDC JWTs are fully validated, and key-confusion and
alg: nonetokens are rejected (both are tested).Per-tool RBAC applies, and every audit line records the caller.
The server refuses to bind to a public address without authentication.
DNS-rebinding protection uses Host/Origin allow-lists.
The container runs as a non-root user.
SVG output: icons are embedded, so the files don't leak local paths and render anywhere.
Layout
src/arch_diagram_mcp/
server.py MCP tools, prompt, error mapping, audit logging
catalog.py icon index, alias resolution, ranked search, suggestions
models.py spec schema + semantic validation
renderer.py Graphviz source build, timed subprocess render, themes, SVG inlining, retention
review.py Well-Architected heuristic rules and scoring
terraform.py Terraform plan/state -> spec
gcp_inventory.py Cloud Asset Inventory export of running GCP resources -> spec
template_library.py + templates/*.json reference architectures
auth.py principals, static-token + OIDC authenticators, RBAC
storage.py local signed links, S3 / Azure Blob / GCS uploads with signed URLs
http_app.py streamable-HTTP app, auth middleware, OAuth resource metadata, /artifacts, /healthz
config.py, logs.py, __main__.py
tests/ 85 tests: catalog, validation, rendering, label injection, review, Terraform, GCP
inventory (real export fixture), MCP tools, HTTP auth, OIDC (incl. attack tokens), RBAC,
signed links, S3 (moto), Azure SAS, GCS V4
docs/USER_GUIDE.md developer guide: connecting clients, example prompts, troubleshooting
docs/CLOUD_TESTING.md how the server was tested on real Google Cloud
docs/samples/ rendered sample diagrams shown above
scripts/render_samples.py regenerates docs/samples/
scripts/e2e_cloud.py, run_impersonated.py real-cloud end-to-end test toolsLicense
Apache-2.0. The bundled provider icons come from the diagrams library and remain subject to their owners' terms.
Available Tools
10 toolsdiagram_from_inventoryA
Diagram infrastructure that is already running, from the cloud's own inventory, with real names.
Google Cloud: pass the output of
gcloud asset list --project <id> --content-type resource --format json
(or gcloud asset export newline-delimited JSON) in inventory_json, or a file path inside
the configured input roots. Works however the resources were created (console, gcloud, IaC).
Layout: Project > VPC > Subnet > GKE cluster > namespace. Edges come from configuration
(Cloud SQL/secret/Pub/Sub references, URLs matched to Cloud Run services, load balancer
backends, push subscriptions, Scheduler targets, VPC connectors). Filter with projects,
regions and labels (e.g. {"app": "payments"}); include_neighbors keeps resources that
matched resources connect to. Calls made only in application code are not visible: add those
edges to the returned spec and re-render with generate_architecture_diagram.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| title | Yes | ||
| labels | No | ||
| regions | No | ||
| projects | No | ||
| provider | No | gcp | |
| direction | No | LR | |
| inventory_json | No | ||
| output_formats | No | ||
| render_diagram | No | ||
| include_neighbors | No | ||
| include_kubernetes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=false, so the agent knows this is a side-effecting but self-contained operation; the description adds real value by disclosing what edges are derived from and what is invisible (application-code-only calls). However it omits where rendered files land, what happens when render_diagram is false, and whether inputs are mutated, which are non-obvious side effects for a tool flagged as not read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then input acquisition, then layout/edge derivation, then filtering and the known limitation, so an agent can stop reading early. The embedded shell command and layout hierarchy string add density but each earns its place as actionable input prep.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers input sourcing, topology hierarchy, edge inference, filtering, and the follow-up workflow, which is a lot for a 12-parameter tool with no output schema. Still missing: where output artifacts are written, default output format behavior, and what the returned spec looks like when rendering is skipped, which an agent needs to chain correctly into generate_architecture_diagram.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does substantial work: it explains inventory_json vs path, the projects/regions/labels filters with a concrete labels example, and include_neighbors behavior. Five parameters (provider, direction, output_formats, render_diagram, include_kubernetes, title) are left entirely to their self-explanatory names, which is a modest but real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (diagram), a specific resource (already-running infrastructure), and the source of truth (the cloud's own inventory with real names), which separates it conceptually from the Terraform-based sibling. It never names diagram_from_terraform explicitly, so the agent must infer the boundary between the two, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete input instructions (the exact gcloud asset list/export command, or a file path within configured input roots) and explains the filter semantics plus include_neighbors. It also routes the agent forward with 'add those edges to the returned spec and re-render with generate_architecture_diagram' when app-code-only calls are missing, though it never states when to prefer diagram_from_terraform instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagram_from_terraformA
Build a diagram from Terraform: terraform show -json plan.out, state JSON, or a .tfstate file.
Pass the JSON text in terraform_json, or a file path inside the configured input roots.
VPC/VNet/subnet/resource-group become nested boundaries; references become edges (dashed =
inferred through listeners, NICs, role assignments, etc.). Returns the generated spec so it
can be refined and re-rendered.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| title | Yes | ||
| direction | No | LR | |
| output_formats | No | ||
| render_diagram | No | ||
| terraform_json | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is non-readOnly, non-idempotent, non-destructive and closed-world, so the safety bar is low. The description still adds real behavior: VPC/VNet/subnet/resource-group map to nested boundaries, references become edges, and dashed edges mean inferred relationships via listeners/NICs/role assignments. It also states the return value (the generated spec, refinable and re-renderable), which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight lines: purpose first, then how to supply input, then the mapping behavior and return value. Every sentence carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states what is returned. It also covers the complex part (resource-to-boundary mapping) plus the input-root security constraint. It falls short on the remaining parameters — notably the required title and the render_diagram toggle — which an agent must infer from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does add genuine meaning for terraform_json (accepts raw JSON text) and path (must be inside configured input roots), but says nothing about title, direction, output_formats, or render_diagram — four of six parameters, including the only required one, are unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Build a diagram from Terraform') and enumerates the exact input artifacts it accepts (plan JSON, state JSON, .tfstate). It implicitly separates itself from diagram_from_inventory by naming Terraform as the source, but never names that sibling, so the differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Pass the JSON text in terraform_json, or a file path inside the configured input roots' gives useful guidance on which of the two source parameters to use. However, there is no statement of when to prefer this over diagram_from_inventory, nor any exclusions or prerequisites for the tool as a whole.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_architecture_diagramA
Render an architecture diagram with official provider icons.
spec.nodes: services (type = icon id from search_icons).
spec.clusters: boundaries (account, subscription, project, region, VPC/VNet, subnet, AZ,
namespace), nested with parent.
spec.edges: node-to-node connections with optional label, colour and style.
spec.output_formats: any of png, svg (self-contained), pdf, jpg.
Returns file paths and an inline PNG preview.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and readOnlyHint=false, so the safety profile is covered. The description adds value by defining the return contract ('file paths and an inline PNG preview') and noting that SVG output is self-contained. It omits where files are written and whether output persists, which is a real gap for a tool that writes to disk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six tight lines, each covering one spec field, with the verb front-loaded and no qualifying boilerplate. Nothing needs to be cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description states the return values, which matters because no output schema exists, and it explains the structure of the nested spec. The only omissions are the presentation-level options (theme, direction, curve_style, filename), which have defaults and schema-level enums.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level schema coverage is 0%, so the description must compensate, and it does so for the four principal fields: it explains that clusters represent boundaries (accounts, regions, VNets/subnets, AZs, namespaces), that edges are node-to-node, and that nodes map to icon ids. However, it never mentions theme, direction, curve_style, filename, or title, so the documentation covers only part of the spec.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line gives a specific verb and resource: 'Render an architecture diagram with official provider icons.' It also routes to search_icons for icon ids. It does not distinguish itself from diagram_from_terraform or diagram_from_inventory, which also produce diagrams, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'type = icon id from search_icons' signals a two-step flow, but the description never says when to use this tool instead of diagram_from_terraform or validate_diagram, or whether validating first is recommended.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_templateARead-onlyIdempotent
Return a reference architecture spec to customise and pass to generate_architecture_diagram.
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds the useful behavioural detail that the returned spec is meant to be modified before use, but says nothing about spec size, format, or whether the returned object is a scaffold with placeholders. With annotations carrying the safety burden, this is an adequate but thin addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the return value and followed by the intended use. Nothing is padded or restated from the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is legitimately omitted, and the read-only annotations cover safety. The critical gap is the required template_id: with zero schema coverage and no mention of list_templates as the source of IDs, an agent lacks what it needs to invoke the tool correctly on the first try.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter template_id, so the description carries the full burden and must compensate — and it does not. It never says where template_id comes from (presumably list_templates) or what form it takes, leaving the agent to guess how to obtain a valid value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Return a reference architecture spec") and ties it to its downstream consumer, generate_architecture_diagram, so it is distinguishable from that sibling. It does not explicitly differentiate itself from list_templates, which is the more likely confusion point for an agent hunting for templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear workflow context: fetch a spec, customise it, then pass it to generate_architecture_diagram. That tells the agent when this tool belongs in a sequence. It stops short of naming alternatives or stating when not to use it (e.g. when you already have a spec, or to browse templates use list_templates).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_icon_categoriesARead-onlyIdempotent
List every category of a provider and the service icons in each.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and closed-world behavior, so safety is covered. The description adds that the result spans all categories and includes the icons within each, but says nothing about ordering, volume, or shape beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with zero filler; the scope ('every category') and returned content ('service icons in each') are packed efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only, one-enum-parameter listing tool with an output schema, the description is nearly sufficient. The only missing piece is routing guidance against search_icons, which the output schema and annotations cannot supply.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the single parameter is a self-explanatory provider enum. The description only signals that the value selects a provider; it adds no nuance about enum values or defaults (though the parameter is required).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List every category of a provider and the service icons in each'), making the tool's function immediately clear. It does not explicitly contrast with the sibling search_icons, but the browse-everything framing distinguishes it in practice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'every category' suggests a browse-all/discovery use case versus filtered search, but the description never names search_icons or states when to prefer one over the other. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesBRead-onlyIdempotent
List bundled reference architectures (AWS, Azure, GCP) that can be loaded with get_template.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and closed-world behavior, so the safety profile is covered. The description adds only the existence of bundled templates and their link to get_template; it says nothing about ordering, whether all templates are returned when no filter is given, or how the provider filter narrows results. With annotations carrying the behavioral load, a 3 fits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is efficient, though its brevity comes at the cost of the provider coverage gap noted above.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover safety. What is missing is the provider filter's behavior and the full set of valid categories; for a simple one-parameter list tool this is adequate but leaves a real gap an agent would hit immediately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%: the single 'provider' parameter has no description and no separate enum field in the coverage count, so semantics rest on the schema alone. The description compensates only partially and inaccurately, naming three providers when eight are valid, so an agent could wrongly assume k8s/onprem/saas/programming/generic are unsupported or that the argument is optional-by-default with no filtering behavior explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus resource (bundled reference architectures), and it names the sibling get_template used to load one. That distinguishes it from get_template and from generation siblings. Minor deduction: the parenthetical '(AWS, Azure, GCP)' understates the actual provider set, since the schema also allows k8s, onprem, saas, programming, and generic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'that can be loaded with get_template' implies a discovery-then-load workflow, which is useful routing. But there is no explicit when-to-use/when-not guidance, and no mention of what to do with the provider filter versus listing everything.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_architectureARead-onlyIdempotent
Heuristic Well-Architected review of a spec (security, reliability, operations, performance).
Returns a 0-100 score, grade, and findings with recommendations. Findings reflect only what the diagram shows.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and closed-world, so the safety profile is covered. The description adds real value beyond that: it discloses the review is heuristic, that findings are bounded by diagram content, and what the output contains (score, grade, recommendations).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and the return contract second; nothing is padding. Minor formatting noise from the mid-sentence line break, but information density is high.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be spelled out, and the review dimensions are listed. However, given the deeply nested DiagramSpec input, the description never signals the input's shape or required fields, leaving a gap for the caller.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (spec) and the description only refers to it obliquely as "a spec". With reported schema description coverage at 0%, the description does not compensate by explaining that a full DiagramSpec with nodes/edges/clusters is required, so an agent must open the schema to build a valid call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Heuristic Well-Architected review of a spec") and names the four review dimensions plus the return shape (score, grade, findings). It does not explicitly differentiate itself from validate_diagram, which is the closest sibling and a plausible confusion point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The caveat "Findings reflect only what the diagram shows" gives useful context about what the review can and cannot see, but there is no statement of when to choose this over validate_diagram or after generate_architecture_diagram. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_iconsBRead-onlyIdempotent
Search ~1,900 official icons by service name, alias or category.
Examples: 'ecs', 's3', 'aks', 'cloud run', 'postgres', 'redis', 'kafka', 'load balancer'.
Returns canonical ids (usable as node type) and their aliases.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| provider | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and closed-world behavior, so safety is covered. The description adds genuine context beyond them: the ~1,900 icon corpus and the fact that results include canonical ids plus aliases. It stays silent on result count, the limit default, and how provider filtering interacts with the query, which leaves meaningful behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: capability and corpus size first, concrete query examples second, return-value contract last. Every sentence carries information an agent needs, and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the brief return-value note is sufficient, and the search tool itself is simple. However, with zero schema description coverage the description should have covered the provider filter and the limit/default page size, which it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for all three parameters. The description explains the query parameter well through examples and the name/alias/category breakdown, but the provider enum (aws, azure, gcp, k8s, etc.) and the limit parameter (default 25) are never mentioned, so two of three parameters remain undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Search ... official icons') plus the searchable fields (service name, alias, category) and the corpus size. It does not explicitly distinguish itself from the sibling list_icon_categories or list_templates, so the differentiation is left to inference rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example queries imply how to use the tool, but there is no explicit guidance on when to search versus calling list_icon_categories to browse, and no statement of what happens when a query returns nothing. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_infoARead-onlyIdempotent
Report version, Graphviz status, icon count, storage, auth mode, caller identity and limits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is clear. The description adds the categories of information returned, but does not disclose additional behavioral traits such as whether the report includes sensitive identity details, whether any limits are dynamic, or how the report is structured beyond what the output schema covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every listed item maps to a concrete piece of reported information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values. It is complete enough for an agent to understand that this is a parameterless server diagnostics tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to explain. The baseline score of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') and enumerates exactly what is reported: version, Graphviz status, icon count, storage, auth mode, caller identity and limits. This clearly distinguishes it from the sibling tools, which all manipulate diagrams, icons, or templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The diagnostic purpose is strongly implied by the enumerated server metadata, so an agent can infer it is for checking server status. However, there is no explicit guidance on when to use it, when not to use it, or whether any alternative exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_diagramARead-onlyIdempotent
Check a spec without rendering: icon ids (with suggestions), references, nesting, limits.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, closed-world semantics, so the description's job is to say what actually happens. It does: the check covers icon ids (with suggestions), references, nesting, and limits, which tells the agent the validation is deep and non-mutating rather than a shallow schema check.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, no filler, with the most decisive constraint ('without rendering') placed early. Every clause maps to a distinct check category.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and annotations cover safety. However, for a validation tool operating on a deeply nested diagram spec with many constraints, the description leaves open whether the tool returns only errors, also suggestions/repairs, and whether a valid spec can then be fed to the generator unchanged.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single top-level parameter 'spec' with no description (0% top-level coverage), though the nested DiagramSpec/$defs fields carry their own rich descriptions. The description adds scope information about which aspects of the spec are validated ('references, nesting, limits'), but does not clarify the shape of the argument itself or whether an invalid spec still needs to be structurally valid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Check a spec without rendering' names a specific verb (check/validate) and resource (diagram spec), and the 'without rendering' clause implicitly distinguishes it from generate_architecture_diagram. It stops short of naming the sibling explicitly, so an agent must infer the pairing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without rendering' implies this is the dry-run/pre-flight step before generation, but the description never states when to call it, whether it should precede generate_architecture_diagram, or what to do with a failing result. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v1.2.0- First observed
diagram_from_inventory - First observed
diagram_from_terraform - First observed
generate_architecture_diagram - First observed
get_template - First observed
list_icon_categories - First observed
list_templates - First observed
review_architecture - First observed
search_icons - First observed
server_info - First observed
validate_diagram
TDQS
Scored across 10 tools
Most tools have clearly distinct purposes: rendering (generate_architecture_diagram), discovery (search_icons, list_icon_categories, list_templates, get_template), validation (validate_diagram vs review_architecture), and import (diagram_from_terraform vs diagram_from_inventory). Minor overlap between search_icons and list_icon_categories (both surface icons) and between validate_diagram and review_architecture (both inspect a spec), but descriptions clarify the intent difference.
Most tools follow a verb_noun pattern (search_icons, list_templates, get_template, validate_diagram, review_architecture) and the two import tools consistently use diagram_from_<source>. Deviations exist: server_info is noun-only and generate_architecture_diagram is a longer verb phrase, but the set reads predictably overall.
Ten tools is well-scoped for a diagram generation server, covering rendering, discovery, templates, validation, review, and two import sources without redundancy. Each tool earns its place in the workflow.
The surface covers the full diagram lifecycle: discover icons, load templates, generate, validate, review, and import from Terraform/inventory. Minor gaps remain—no explicit tool to save/manage custom templates or to retrieve/edit previously generated diagram files—but core workflows are well supported.
Maintenance
Related MCP Connectors
Generate cloud architecture diagrams, flowcharts, and sequence diagrams.
Draw your app's architecture on a live canvas and flag the bottlenecks and security gaps.
Discover cloud shapes and create, inspect, validate, patch, and review architecture diagrams.
Simulate cloud infrastructure and estimate cost before deploying or changing infrastructure.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProfessional AI-powered architecture diagram generator with multi-cloud support and MCP server integration. Generates beautiful, accurate diagrams with provider-specific icons for AWS, Azure, GCP, Kubernetes, and more.21 PyPI11MIT
- AlicenseNot gradedqualityDmaintenanceScans AWS environments and generates professional architecture diagrams showing VPC networking, compute, storage, and security resources.MIT
- AlicenseAqualityDmaintenanceGenerates professional architecture diagrams from natural language descriptions using template-driven prompts and swappable AI image providers.72MIT
- AlicenseNot gradedqualityDmaintenanceEnables visualization of Terraform plan changes as interactive cloud architecture diagrams with official AWS, Azure, and GCP icons, showing resource dependencies and changes.7MIT