Blueprint docs
Connect and sign in
- In Claude, add a custom connector with this address:
https://blueprint.echelonagents.ai/mcp
- Claude opens the Blueprint sign-in page.
- Enter your email address.
- We email you a 6-digit code. It works for 10 minutes.
- Enter the code. You are connected.
The two tools
render_diagram (Render a diagram): draws a spec as a PNG image. The answer also lists layout-review
warnings and any icon names that were replaced by a grey lettered square. Optional: sizePreset, theme.
verify_diagram (Verify a diagram): checks a spec, or the HTML Blueprint produced, for layout problems such as a label hidden behind a node. It makes no image and does not count against your render limit.
Both only read and compute: they change nothing outside Blueprint and reach no other websites.
The spec
A spec is a JSON object. type is one of architecture, flowchart, sequence.
Every type needs a title; description, sizePreset and theme (light or dark) are optional.
- architecture:
nodes(at least 1) withid,label,icon, and optionalkind(focal, backend, store, external, input, optional, security),sublabel,zone,col,row;edgeswithfrom,to, optionallabelandstyle(primary, link, muted, dashed);zoneswithid,label. - flowchart:
nodeswithid, optionallabel,kind(start, end, process, decision, io, merge),icon;edgeswithfrom,to, optionallabelandbranch(yes, no, none). - sequence:
participants(at least 2) withid,label, optionalkind,icon;messages(at least 1) withfrom,to, optionallabelandkind(sync, async, return, self).
A decision node is drawn as a diamond; give each exit branch yes or no and the line prints YES or NO.
Flowchart nodes are placed from the edges, so the order of the nodes list does not matter.
Minimal complete spec for each type
architecture
{
"type": "architecture",
"title": "Web app",
"nodes": [
{
"id": "api",
"label": "API",
"icon": "server"
},
{
"id": "db",
"label": "Database",
"icon": "database",
"kind": "store"
}
],
"edges": [
{
"from": "api",
"to": "db",
"label": "read / write"
}
]
}flowchart
{
"type": "flowchart",
"title": "Password reset",
"nodes": [
{
"id": "s",
"kind": "start",
"label": "Forgot password"
},
{
"id": "v",
"kind": "decision",
"label": "Link valid?"
},
{
"id": "n",
"kind": "process",
"label": "Set new password"
},
{
"id": "e",
"kind": "end",
"label": "Show error"
}
],
"edges": [
{
"from": "s",
"to": "v"
},
{
"from": "v",
"to": "n",
"branch": "yes"
},
{
"from": "v",
"to": "e",
"branch": "no"
}
]
}sequence
{
"type": "sequence",
"title": "Sign in",
"participants": [
{
"id": "u",
"label": "User"
},
{
"id": "a",
"label": "App"
}
],
"messages": [
{
"from": "u",
"to": "a",
"label": "open the app"
},
{
"from": "a",
"to": "u",
"label": "signed in",
"kind": "return"
}
]
}
Built-in icon keys: user, browser, app, server, database, queue, cdn, worker, identity, laptop, phone, tablet, terminal and location-pin. Any other key still renders, as a grey rounded square with the first letter of the label, and is reported in the answer.
Example prompts
Example 1
"Draw the architecture of a web app: a user reaches a CDN, which forwards to an API; the API uses a database and a job queue, and a worker processes the queue and writes to the database."
Claude passes a spec like this to render_diagram:
{
"type": "architecture",
"title": "Web app: CDN, API, queue, worker and database",
"sizePreset": "doc-wide",
"theme": "light",
"zones": [
{
"id": "backend",
"label": "Backend"
}
],
"nodes": [
{
"id": "user",
"label": "User",
"sublabel": "browser",
"kind": "input",
"icon": "user",
"col": 0,
"row": 1
},
{
"id": "cdn",
"label": "CDN",
"sublabel": "edge cache",
"kind": "external",
"icon": "cdn",
"col": 1,
"row": 1
},
{
"id": "api",
"label": "API",
"sublabel": "stateless",
"kind": "focal",
"icon": "server",
"col": 2,
"row": 1,
"zone": "backend"
},
{
"id": "queue",
"label": "Job queue",
"sublabel": "async work",
"kind": "backend",
"icon": "queue",
"col": 3,
"row": 0,
"zone": "backend"
},
{
"id": "worker",
"label": "Worker",
"sublabel": "background jobs",
"kind": "backend",
"icon": "worker",
"col": 4,
"row": 1,
"zone": "backend"
},
{
"id": "db",
"label": "Database",
"sublabel": "primary store",
"kind": "store",
"icon": "database",
"col": 3,
"row": 2,
"zone": "backend"
}
],
"edges": [
{
"from": "user",
"to": "cdn",
"label": "HTTPS",
"style": "link"
},
{
"from": "cdn",
"to": "api",
"label": "origin",
"style": "primary"
},
{
"from": "api",
"to": "queue",
"label": "enqueue",
"style": "muted"
},
{
"from": "api",
"to": "db",
"label": "read / write",
"style": "muted"
},
{
"from": "queue",
"to": "worker",
"label": "consume",
"style": "muted"
},
{
"from": "worker",
"to": "db",
"label": "write",
"style": "dashed"
}
]
}Example 2
"Make a flowchart of sign-up with email verification: validate the email, send a 6-digit code, check it, and create the account."
Claude passes a spec like this to render_diagram:
{
"type": "flowchart",
"title": "Sign-up with email verification",
"sizePreset": "doc-wide",
"theme": "light",
"nodes": [
{
"id": "start",
"kind": "start",
"label": "Start sign-up",
"col": 1,
"row": 0
},
{
"id": "form",
"kind": "io",
"label": "Enter email and password",
"col": 1,
"row": 1
},
{
"id": "d1",
"kind": "decision",
"label": "Email valid?",
"col": 1,
"row": 2
},
{
"id": "err",
"kind": "end",
"label": "Show form error",
"sublabel": "stay on the form",
"col": 2,
"row": 2
},
{
"id": "send",
"kind": "process",
"label": "Send 6-digit code",
"icon": "server",
"col": 1,
"row": 3
},
{
"id": "d2",
"kind": "decision",
"label": "Code correct?",
"col": 1,
"row": 4
},
{
"id": "retry",
"kind": "end",
"label": "Ask for the code again",
"sublabel": "up to 5 tries",
"col": 2,
"row": 4
},
{
"id": "create",
"kind": "process",
"label": "Create account",
"icon": "database",
"col": 1,
"row": 5
},
{
"id": "done",
"kind": "end",
"label": "Signed in",
"col": 1,
"row": 6
}
],
"edges": [
{
"from": "start",
"to": "form"
},
{
"from": "form",
"to": "d1"
},
{
"from": "d1",
"to": "err",
"branch": "no"
},
{
"from": "d1",
"to": "send",
"branch": "yes"
},
{
"from": "send",
"to": "d2"
},
{
"from": "d2",
"to": "retry",
"branch": "no"
},
{
"from": "d2",
"to": "create",
"branch": "yes"
},
{
"from": "create",
"to": "done",
"accent": true
}
]
}Example 3
"Show a sequence diagram of a user signing in to an app through an identity provider: the app redirects to the provider, then exchanges the returned authorization code for an access token."
Claude passes a spec like this to render_diagram:
{
"type": "sequence",
"title": "Sign in with an identity provider",
"sizePreset": "doc-wide",
"theme": "light",
"participants": [
{
"id": "user",
"label": "User",
"sublabel": "browser",
"kind": "input",
"icon": "user"
},
{
"id": "app",
"label": "App",
"sublabel": "web app",
"kind": "focal",
"icon": "app"
},
{
"id": "idp",
"label": "Identity provider",
"sublabel": "sign-in service",
"kind": "external",
"icon": "identity"
}
],
"messages": [
{
"from": "user",
"to": "app",
"kind": "sync",
"label": "open the app"
},
{
"from": "app",
"to": "idp",
"kind": "sync",
"link": true,
"label": "redirect to sign-in"
},
{
"from": "idp",
"to": "app",
"kind": "sync",
"label": "authorization code"
},
{
"from": "app",
"to": "idp",
"kind": "sync",
"label": "exchange code"
},
{
"from": "idp",
"to": "app",
"kind": "return",
"label": "access token"
},
{
"from": "app",
"to": "user",
"kind": "sync",
"accent": true,
"label": "signed in"
}
],
"activations": [
{
"participant": "app",
"from": 0,
"to": 5
},
{
"participant": "idp",
"from": 1,
"to": 4
}
]
}
Limits
- 30 renders per hour per account. The answer to a refused call says when the next render is available.
- Spec up to 256 KiB, 150 nodes, 300 edges, 500 characters per text field; edge labels are cut at 80 characters and 24 words with a warning.
- Each render has a 15 second limit.
Help
See support.