blueprint-chart/mcp
This server lets LLMs author, validate, render, and share Blueprint Chart (.bpc) charts using MCP tools, resources, and prompts.
Validate DSL: Parse and semantically validate
.bpcsource, returning structured errors and warnings with suggestions.Inspect DSL: Summarize a chart's type, scenes, series, rows, highlights, annotations, and other structural details.
Recommend chart type: Get ranked chart-type suggestions based on column types, row count, and a goal.
Render charts: Render to SVG, PNG, or HTML with width/height control, optional disk saving, and stateless hosted URLs.
List chart types: Enumerate all renderable chart types with aliases and summaries.
Describe chart type: Get when-to-use, when-not-to-use, properties, directives, and data shape for a specific chart type.
Get example: Fetch canonical
.bpcsamples by sample name or chart type.Search examples: Find canonical examples by topic keywords and/or chart type.
Get grammar: Retrieve the full DSL grammar reference or a focused section.
List palettes: List named color palettes and their hex colors for
colorPalette.Export charts: Create editable and embeddable shareable URLs with an inline preview.
Reference resources: Read
bpc://resources like handbook pages, guides, chart-type docs, grammar, and samples.Authoring prompt: Use the
author_chartprompt to guide end-to-end chart creation, validation, and iteration.
Click on "Install 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., "@blueprint-chart/mcpcreate a bar chart of monthly revenue"
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.
Status | |
CI checks | |
Latest version | |
Release date | |
Open issues | |
Websites |
|
Smithery |
The MCP exposes Blueprint Chart's dataviz handbook, DSL grammar reference, chart-type docs, and canonical samples as MCP resources, plus eleven deterministic tools: validate_dsl, inspect_dsl, recommend_chart_type, render, list_chart_types, describe_chart_type, get_example, get_grammar, export_chart, search_examples, and list_palettes. Your LLM writes the .bpc; the MCP grounds it in real dataviz pedagogy and gives it a tight feedback loop.
Install
npx @blueprint-chart/mcp # stdio (for Claude Desktop, Claude Code, Cursor)
npx @blueprint-chart/mcp --http # HTTP/SSE on 127.0.0.1:4321Related MCP server: Sisense MCP Server
Use with Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"blueprint-chart": {
"command": "npx",
"args": ["-y", "@blueprint-chart/mcp"]
}
}
}Use with Claude Code
claude mcp add blueprint-chart \
-e BLUEPRINT_CHART_EDITOR_URL=https://blueprintchart.com \
-e BLUEPRINT_CHART_DOCS_URL=https://docs.blueprintchart.com \
-- npx -y @blueprint-chart/mcpTools
Tool | Purpose |
| Parse |
| Parse and summarize: |
| Rank chart types for a given column shape and row count |
| Render to SVG (default), PNG, or HTML; with |
| List all renderable chart types (tool equivalent of |
| Properties, when-to-use, when-NOT-to-use, and data-shape for one chart type (tool equivalent of |
| Fetch a canonical |
| Find canonical examples by topic keywords and/or chart type (returns pointers; fetch full DSL with |
| Full DSL syntax reference (tool equivalent of |
| List named colour palettes with hex colours for |
| Validate a |
The discovery tools (list_chart_types, describe_chart_type, get_example, search_examples, get_grammar, list_palettes) let clients without MCP resource support access the same reference material that the bpc:// URIs expose.
Saving rendered output
The render tool can write its output to disk via save: <path>. This is disabled by default. Set MCP_FS_WRITE_DIR to a directory to enable it — ideally an absolute path; a relative value is resolved from the server's working directory at startup. Every write lands inside that directory (a sandbox), so you never have to worry about where a client puts files: relative save paths are joined to it, an absolute path already inside it is used as-is, and any other absolute path is re-anchored under it (the leading slash is stripped and the rest joined on, so save: "/tmp/foo.png" becomes <dir>/tmp/foo.png). Only paths that still escape via ../ traversal are rejected. Missing subdirectories are created automatically. Containment is checked lexically (no realpath), so a symlink whose lexical path is inside the sandbox still passes the check and is then resolved by the OS at write time — if its target is outside the sandbox, the write reaches it. Avoid placing symlinks in the sandbox if isolation matters to you.
Add the -e flag to your claude mcp add command:
claude mcp add blueprint-chart \
-e MCP_FS_WRITE_DIR=/path/to/output \
-- npx -y @blueprint-chart/mcpResources
bpc://grammar— full DSL syntax referencebpc://handbook/<slug>— dataviz pedagogy (choosing, design-principles, color, typography, annotations, accessibility, ...)bpc://guide/<slug>— usage guides (scenes, palettes, data-transforms, ...)bpc://chart-types/<slug>— per-chart-type docsbpc://samples/<id>— canonical.bpcexamplesbpc://reference/dsl/<slug>,bpc://reference/api/<slug>— full reference
Prompts
author_chart— primes the LLM end-to-end (read → write → validate → render → iterate)
Examples
Quickstart with Claude
Once the MCP is connected, ask Claude to make a chart:
You: Make a horizontal bar chart of English letter frequencies — top 10, highlight E.
Claude: (calls
list_chart_types,get_example({ chartType: "bar-horizontal" }), writes the.bpc, callsvalidate_dslto confirm it parses, callsrenderwithformat: 'png'and shows you the image and the source)Here's the chart:
![image]
chart bar-horizontal { title = "E is the most frequent letter in English" sort = descending valueLabels = true highlight "E" data { "E" = 12.70; "T" = 9.06; "A" = 8.17; ... } }
The MCP grounds Claude in real dataviz pedagogy (the handbook) before it writes a single line of DSL, then closes the loop with deterministic parse + render feedback.
What .bpc looks like
chart bar-vertical {
title = "E is the most frequent letter in English"
description = "How often each letter appears in typical English text"
source = "Lewand, Cryptological Mathematics"
colorPalette = "London"
sort = descending
valueLabels = true
highlight "E"
data {
"E" = 12.70
"T" = 9.06
"A" = 8.17
"O" = 7.51
...
}
}Full grammar at bpc://grammar; 17 canonical samples at bpc://samples/<id> (letter-frequency, co2-emissions, quarterly-revenue, browser-market, temperature-anomaly, population-stacked-bar, ...).
validate_dsl — parse with structured diagnostics
Request:
{
"name": "validate_dsl",
"arguments": { "source": "chart bar-vertical {\n title = \"oops\n}" }
}Response — valid is false; each entry in errors[] carries a code, human-readable message, and an actionable suggestion:
{
"valid": false,
"errors": [
{
"code": "E_PARSE",
"message": "Expected \"\\\"\" but end of input found.",
"suggestion": "Close the string literal on line 2."
}
],
"warnings": []
}inspect_dsl — structured summary
Request:
{ "name": "inspect_dsl", "arguments": { "source": "<.bpc source>" } }Response:
{
"ok": true,
"data": {
"chartType": "bar-vertical",
"scenes": [{ "index": 1, "hasTransition": false }],
"hasAnnotations": false,
"hasColorizes": false,
"hasHighlights": true,
"hasAreaFills": false,
"seriesCount": 0,
"rowCount": 26
}
}recommend_chart_type — ranked suggestions
Request:
{
"name": "recommend_chart_type",
"arguments": { "columnTypes": ["date", "number", "number", "number"], "rowCount": 24 }
}Response:
{
"ok": true,
"data": {
"recommendations": [
{ "chartType": "line-multi", "label": "Multi-Line Chart", "fitness": "best",
"reason": "1 date + 3 numeric columns — compare trends" },
{ "chartType": "bar-multi", "label": "Grouped Bar Chart", "fitness": "alternative",
"reason": "Can also show as grouped bars" }
]
}
}render — SVG (default), PNG, or HTML
Request:
{
"name": "render",
"arguments": { "source": "<.bpc source>", "format": "png", "width": 800, "height": 500 }
}Response:
{
"ok": true,
"data": {
"svg": "<svg ...>...</svg>",
"png": "<base64-encoded image>",
"mimeType": "image/png",
"urls": {
"png": "https://mcp.blueprintchart.com/render.png?bpc64=…",
"svg": "https://mcp.blueprintchart.com/render.svg?bpc64=…",
"bpc": "https://mcp.blueprintchart.com/render.bpc?bpc64=…"
}
}
}The urls field is only present when MCP_PUBLIC_URL is configured; every render and export_chart response then includes these stateless links, with the chart data travelling inside the URL (as bpc64, a URL-safe base64 encoding of the .bpc source) — no session, no server state required. Set modelVisible:false in the request to drop the inline image from the response entirely, spending no image tokens.
If rasterization fails (rare), errors[] is non-empty — each entry has a code ("E_RENDER") and a suggestion — and the response still includes the SVG that was successfully produced, so partial success is preserved.
Hosted render URLs
Embed a chart directly in a page:
<img src="https://<your-mcp-host>/render.png?bpc64=<bpc64value>&width=800&height=500" alt="My chart" width="800" height="500">/render.bpc serves the raw .bpc source — it's "view source" for any chart URL, handy for sharing or reproducing a chart from its link alone.
Sources whose encoding exceeds 8 KB return 413 from the endpoints (and the tool omits urls, returning urlsOmitted: "source-too-large" instead) — use the inline PNG for very large charts.
Reading a resource
{ "uri": "bpc://handbook/choosing" }Returns the full Markdown of the "Choosing the Right Chart" handbook page (same content as docs.blueprintchart.com).
{ "uri": "bpc://samples/letter-frequency" }Returns the raw .bpc source for the letter-frequency sample as text/plain — exactly what the LLM should imitate.
License
MIT
Available Tools
11 toolsdescribe_chart_typeARead-onlyIdempotent
Return everything an LLM needs to write a .bpc for a given chart type — typically your second call, after recommend_chart_type. Input: { chartType: "bar-horizontal" } (or any canonical/alias name). Returns summary, when-to-use, when-NOT-to-use, full property list with enum choices, data-shape example, and a pointer to a canonical sample.
| Name | Required | Description | Default |
|---|---|---|---|
| chartType | Yes | A chart type or alias to describe, e.g. "bar-horizontal" or "line". |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Canonical chart-type identifier. |
| aliases | Yes | Accepted alias names. |
| docsUrl | No | Public docs URL. |
| summary | Yes | One-line description. |
| dataShape | Yes | The data shape this chart type expects. |
| whenToUse | Yes | Situations this chart type fits. |
| directives | Yes | Supported directives. |
| properties | Yes | Supported chart properties. |
| exampleSlug | No | Id of a canonical sample for this type. |
| whenNotToUse | Yes | Situations to avoid it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true and idempotent=true. The description adds valuable behavioral context by enumerating the contents of the return value (summary, when-to-use, when-not-to-use, property list, data-shape example, sample pointer). This goes beyond the annotations and helps the agent know what to expect.
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 two sentences, front-loaded with purpose, then input format, then return contents. It is dense but every sentence earns its place, with no fluff.
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 tool has one simple parameter, an output schema exists, and the description details what the call returns and where it fits in the workflow. This is fully sufficient for selecting and invoking the tool correctly.
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 coverage is 100%, so the schema already describes chartType well. The description reinforces this by providing a concrete example ('bar-horizontal') and clarifying that aliases are accepted. This adds a useful concrete usage hint beyond the schema's generic description.
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 clearly states the tool's purpose: 'Return everything an LLM needs to write a .bpc for a given chart type.' It uses a specific verb (return) and resource (chart type), and explicitly distinguishes from sibling 'recommend_chart_type' by positioning this as the second call.
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?
Provides clear contextual guidance: 'typically your second call, after recommend_chart_type.' This tells the agent where in the workflow to use it. However, it does not explicitly state when not to use it or mention alternative tools like get_grammar or get_example, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_chartARead-onlyIdempotent
Turn a validated .bpc source into shareable URLs plus an inline visual preview of what was published. Returns { copyUrl, embedUrl, urls?, frame } and a scene-0 PNG image block so you can confirm the chart looks right before sharing. copyUrl opens an editable copy in the editor; embedUrl is a read-only iframe target; urls.{png,svg,bpc} (when MCP_PUBLIC_URL is set) are stateless rendered-image/source links. Set modelVisible:false to show the preview to the user only. Requires BLUEPRINT_CHART_EDITOR_URL; preview failures never block the export.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | The .bpc chart source to validate and publish to shareable URLs. | |
| modelVisible | No | When false, the preview image is shown to the user but not sent to the model. |
Output Schema
| Name | Required | Description |
|---|---|---|
| urls | No | Stateless hosted render URLs (only when MCP_PUBLIC_URL is set). |
| frame | Yes | Frame metadata extracted from the chart. |
| copyUrl | Yes | Editor URL that opens an editable copy of the chart. |
| embedUrl | Yes | Read-only iframe-embeddable URL. |
| previewOmitted | No | Set when the scene-0 preview render failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful behavioral context: it requires the environment variable BLUEPRINT_CHART_EDITOR_URL, states that preview failures never block the export, and explains the availability of urls.{png,svg,bpc} based on MCP_PUBLIC_URL. This goes beyond the annotations and enriches the agent's understanding.
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 moderately concise, with three sentences that pack substantial detail: the main purpose, the return object structure with per-field explanations, environment requirements, and failure handling. Every sentence contributes to the overall understanding, though the enumeration of URL fields makes it slightly denser than necessary. It is well-structured and front-loaded with the core behavior.
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?
Given the presence of an output schema and only two simple parameters, the description covers the essential context: return value semantics, environment prerequisites, failure behavior, and a timeout-related tweak (modelVisible). It does not explicitly state what happens on invalid input, but that is a minor gap given the tool's purpose and the fact that the schema already describes the source as 'validated.' Overall, it is comprehensive enough for an agent to select and invoke correctly.
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 100%, so both parameters are already well-documented. The tool description does not add significant additional meaning beyond what the schema provides; it mostly echoes the schema's descriptions. The explanation of modelVisible in the description is nearly identical to the schema description. Therefore, baseline 3 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 opens with a specific verb+resource: 'Turn a validated .bpc source into shareable URLs plus an inline visual preview.' This clearly distinguishes it from sibling tools like render or validate_dsl, which focus on other aspects. It explains exactly what is produced (URLs, preview) and the use case (before sharing).
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 provides clear context for when to use the tool: when you have a validated .bpc source and want shareable URLs/preview. It implies the tool is for sharing, but it does not explicitly contrast with alternatives like render or list_chart_types, nor does it state when not to use it. Hence a 4, not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exampleARead-onlyIdempotent
Return a canonical .bpc example. Pass { name } for a specific sample id, { chartType } for the first sample of that type, or no args for a starter sample.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Return a specific sample by its id, e.g. "co2-emissions". | |
| chartType | No | Return the first canonical sample for this chart type (or alias). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Sample id. |
| dsl | Yes | The full .bpc source of the sample. |
| title | Yes | Sample title. |
| chartType | Yes | Chart type of the sample. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent. The description adds meaningful behavioral context by noting the selection logic ('first sample of that type', 'starter sample when no args'), which goes beyond the annotations and helps predict the tool's deterministic behavior.
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 two sentences with no fluff. It front-loads the core purpose and immediately covers usage modes, making it highly scannable and efficient.
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?
Given the simple two-parameter tool, a read-only annotation, an output schema, and full parameter documentation, the description covers all essential usage scenarios and default behavior. Nothing critical is missing.
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 descriptions cover both parameters at 100%, so the baseline is 3. The description adds value by explicitly explaining the effect of supplying no arguments (returns a starter sample), which is not included in the schema. It also reinforces the distinction between 'name' and 'chartType' roles.
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?
Description states a specific verb ('Return') and resource ('a canonical .bpc example'), clearly distinguishing from siblings like search_examples by emphasizing 'canonical'. The optional parameter modes are described, making the tool's purpose unambiguous.
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 explicitly explains when to pass 'name', when to pass 'chartType', and when to pass no args for a starter sample. It does not explicitly mention when to prefer alternatives like search_examples, but the usage conditions are clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_grammarCRead-onlyIdempotent
Return the .bpc DSL grammar as markdown. Pass { section: "chart" | "data" | "properties" | "scenes" | "annotations" } for a focused subset, or no args for the full grammar.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | Limit to one grammar section: "chart", "properties", "scenes", or "annotations". Omit (or "all") for the full grammar. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | The grammar reference as markdown. |
| section | Yes | The grammar section returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint, so the safety profile is covered. The description adds that the output is markdown, but reveals no other behavioral traits like pagination or errors. It does not contradict the annotations.
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 concise, two sentences, and front-loaded with the main purpose. However, the second sentence's enum list is factually inaccurate, making that sentence harmful rather than helpful.
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 tool is simple and the schema covers the parameter, but the description's error about valid sections creates a meaningful gap. It is otherwise complete enough given the output schema and annotations.
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 schema fully documents the parameter with a correct enum including 'all'. The description's list omits 'all' and incorrectly includes 'data', which is not in the schema. This misleading information is worse than relying on the schema alone.
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 clearly states the tool returns the .bpc DSL grammar as markdown, giving a specific verb and resource. It doesn't explicitly contrast with sibling tools like inspect_dsl, but the grammar focus is distinct enough.
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 only explains how to pass the section parameter ('no args for full grammar' or a focused subset). It gives no guidance on when to choose this tool over alternatives such as validate_dsl or inspect_dsl, so usage context is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_dslARead-onlyIdempotent
Parse a .bpc source and return a structured summary: chartType, scenes, data (rowCount, entryCount, labels, seriesNames, multiSeries), annotation/colorize/highlight/area-fill presence flags, series count.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | The .bpc chart source to parse and summarize. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Summary of the data block. |
| scenes | Yes | Per-scene summaries (always at least one). |
| chartType | Yes | Declared chart type. |
| seriesCount | Yes | Number of series. |
| hasAreaFills | Yes | Whether any area-fill is present. |
| hasColorizes | Yes | Whether any non-highlight colorize is present. |
| hasHighlights | Yes | Whether any highlight is present. |
| hasAnnotations | Yes | Whether any annotation/range/note is present. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safe read-only nature is covered. The description adds that it returns a structured summary with specific fields, but it does not disclose any potential limitations, error behavior, or what happens with invalid sources. This is adequate given the annotations but not rich.
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, well-structured sentence starting with the action 'Parse a .bpc source' followed by a concise enumeration of the returned summary fields. There is no fluff or redundant information, making it highly efficient.
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 tool with one well-documented parameter, an output schema, and strong annotation coverage, this description is complete. It explains what the tool does and what the output contains, leaving no critical gaps for agent invocation.
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 100%, with the 'source' parameter already described as 'The .bpc chart source to parse and summarize.' The description simply repeats this with 'Parse a .bpc source,' adding no extra semantic detail about format, size limits, or accepted encodings beyond the schema.
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 clearly states the tool 'Parse a .bpc source' and lists the exact components of the structured summary (chartType, scenes, data details, feature flags, series count). This specific verb+resource pairing with detailed outputs distinguishes it from sibling tools like validate_dsl or recommend_chart_type.
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 implies usage when you need a structured summary of a .bpc source, but it does not explicitly state when to use this tool over alternatives or mention any exclusions. There is no reference to siblings like validate_dsl or render, leaving usage guidance solely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chart_typesARead-onlyIdempotent
Reference list of every chart type the renderer supports, with aliases and one-line summaries. To choose a type for a dataset, call recommend_chart_type instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| chartTypes | Yes | Every renderable chart type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows this is a safe, idempotent read operation. The description adds that it returns aliases and one-line summaries, which is useful context but not extensive. No contradiction with annotations, but it doesn't add much beyond what annotations already imply.
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 two sentences, front-loaded with the core purpose and immediately followed by a relevant alternative. Every word earns its place, with no extraneous details.
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 zero-parameter, read-only reference tool with an output schema and clear annotations, the description is complete. It states what the tool returns (chart types with aliases and summaries) and provides alternative guidance. The output schema covers return value specifics, so no further detail is required.
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 has zero parameters (empty schema), so the baseline is 4. The description adds no parameter info, but none is needed since there are no inputs to explain.
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 clearly states the tool's purpose: 'Reference list of every chart type the renderer supports, with aliases and one-line summaries.' It uses a specific verb ('list') and resource ('chart types'), and distinguishes itself from the sibling `recommend_chart_type` by explicitly naming it as an alternative.
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 provides explicit usage guidance: 'To choose a type for a dataset, call recommend_chart_type instead.' This clearly tells the agent when NOT to use this tool and what to use instead, which is strong alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_palettesARead-onlyIdempotent
List every named colour palette with its label and hex colours, for use in colorPalette = "<name>".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| palettes | Yes | Every named palette. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds value by specifying that it returns labels and hex colours. It does not contradict annotations and gives more detail about the output content.
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, concise sentence that is front-loaded with the action and includes a usage hint. Every word earns its place with no redundancy.
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 zero-parameter, read-only listing tool with an output schema, the description fully covers the tool's purpose and usage context. It is complete without needing to explain return values since the output schema exists.
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 has zero parameters, so the description has no parameter burden. The schema is empty and coverage is 100%, making the baseline 4; the description doesn't need to add parameter details.
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 clearly states the tool lists every named colour palette with its label and hex colours, using a specific verb and resource. It distinguishes itself from sibling tools by focusing on palettes rather than chart types or DSL validation.
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 provides clear context by mentioning usage in `colorPalette = "<name>"`, implying when this tool is useful. It does not explicitly state alternatives or exclusions, but given the lack of sibling palette tools, this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_chart_typeARead-onlyIdempotent
Start here before writing any .bpc. Takes column types, row count, and the user's goal (a prose sentence — it determines the chart family: comparison/ranking/part-to-whole/composition-over-time/trend/range). Returns ranked chart-type recommendations plus guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | Optional prose sentence describing what the chart should show. Determines the chart family (comparison / ranking / part-to-whole / composition-over-time / trend / range). | |
| rowCount | Yes | Number of data rows in the dataset. | |
| columnTypes | Yes | The type of each data column, in order: "string", "number", or "date". |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Prose next-step guidance for the top recommendation. |
| recommendations | Yes | Ranked chart-type recommendations, best first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so safety is covered. The description adds workflow context and return format but doesn't disclose additional behavioral traits like limitations (e.g., goal is optional) or edge cases beyond what annotations provide.
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 concise sentences with front-loaded imperative ('Start here') and a clear summary of inputs and outputs. Every word earns its place with no redundancy.
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 annotations covering safety, an output schema present, and 100% parameter schema coverage, the description provides the essential workflow context ('start here') and output expectation ('ranked chart-type recommendations plus guidance'). It is complete for an agent to select and invoke the tool correctly.
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 100%, so parameters are already well-documented. The description repeats the inputs (column types, row count, goal) and adds that goal determines the chart family, but the schema already states this, providing no significant additional meaning.
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 clearly states the tool's function: 'Start here before writing any .bpc' and 'Returns ranked chart-type recommendations plus guidance.' It distinguishes from siblings like list_chart_types (which enumerates chart types) by emphasizing data-driven recommendation based on column types, row count, and goal.
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 opening 'Start here before writing any .bpc' explicitly positions this as the first step in the workflow, giving clear usage context. However, it doesn't explicitly name alternatives or when not to use it, though the sibling context makes the distinction inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renderAIdempotent
Render a .bpc source to SVG (default), PNG, or HTML. With format:"png" the chart comes back as an inline IMAGE you and the user can both see — render, look at the result, fix issues, re-render. Always returns structured frame metadata. When MCP_PUBLIC_URL is set the response includes stateless urls ({png,svg,bpc}). Set modelVisible:false to display the image to the user without spending model image tokens. Pass save:<path> to write the output into MCP_FS_WRITE_DIR instead of returning it inline. Width/height are capped at 1600; PNGs are rasterized at 2× for retina sharpness.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Optional output path, always resolved inside MCP_FS_WRITE_DIR (relative paths are joined to it; absolute paths are re-anchored under it). When set, the output is written to disk and omitted from the response. Requires MCP_FS_WRITE_DIR. | |
| scene | No | Zero-based scene index to render, for charts that define scenes. Omit for the base chart (scene 0). | |
| width | No | Output width in pixels (max 1600). PNGs are rasterized at 2x for retina sharpness. | |
| format | No | Output format. "svg" (default) and "html" return text; "png" returns an inline image you and the user can both see. | svg |
| height | No | Output height in pixels (max 1600). | |
| source | Yes | The .bpc chart source to render. | |
| modelVisible | No | When false, the inline PNG is shown to the user but not sent to the model (saves image tokens on bulk renders). |
Output Schema
| Name | Required | Description |
|---|---|---|
| urls | No | Stateless hosted render URLs (only when MCP_PUBLIC_URL is set). |
| frame | Yes | Frame metadata extracted from the chart. |
| savedTo | No | Absolute path the output was written to, when `save` was used. |
| mimeType | Yes | MIME type of the rendered output. |
| urlsOmitted | No | Set when URLs were omitted because the source exceeded the URL cap. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses many behavioral traits beyond the annotations: inline image behavior for PNG, structured frame metadata, stateless URLs under MCP_PUBLIC_URL, save path behavior with MCP_FS_WRITE_DIR, width/height caps, and 2× retina rasterization. It complements the idempotentHint and non-destructive annotations without contradiction.
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 dense yet efficient, front-loading the core purpose in the first sentence and then delivering actionable details without fluff. Every sentence adds value, covering formats, image visibility, metadata, URLs, saving, and size caps.
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?
Given the rich input schema, annotations, and output schema, the description covers all important behavioral aspects: output formats, inline image behavior, save semantics, model visibility, size caps, and environment-dependent URLs. It is sufficiently complete for an agent to use the tool correctly.
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 coverage is 100%, so baseline is 3. The description adds extra meaning for format (inline image vs text), save (writes to disk and omits from response), and modelVisible (toggles image token consumption), which goes beyond the schema's per-parameter descriptions.
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 clearly states the tool's core function with a specific verb and resource: 'Render a .bpc source to SVG (default), PNG, or HTML.' It also differentiates from siblings by focusing on rendering output, while siblings like validate_dsl and inspect_dsl handle validation/analysis.
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 provides clear context on how to use the tool: iterative render-fix cycles, saving to disk with save:<path>, controlling model visibility with modelVisible:false, and explaining format choices. However, it does not explicitly mention alternatives or when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_examplesARead-onlyIdempotent
Find canonical .bpc examples by topic keywords and/or chart type. Returns ranked pointers { id, title, description, chartType } — call get_example with an id to fetch the full DSL.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (max 20). | |
| query | No | Topic keywords to match against sample titles and descriptions. | |
| chartType | No | Restrict results to this chart type (or alias). |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Ranked sample pointers, best first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and idempotentHint annotations covering safety, the description adds behavioral context by revealing that results are 'ranked pointers' with specific fields, and that examples are 'canonical', implying a curated set. This goes beyond the annotations.
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, compact sentence that front-loads the purpose, then provides the return shape and a pointer to get_example. Every word contributes meaning, with no fluff or redundancy.
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?
Given the output schema exists, the description doesn't need to detail return values. It fully covers the tool's role and relationship to get_example, and the optional parameters are all documented in the schema, making this complete for agent invocation.
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 100%, so each parameter (limit, query, chartType) is already fully documented. The description's phrase 'by topic keywords and/or chart type' adds minimal new information beyond the schema, warranting the baseline score of 3.
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 clearly states the tool's function: 'Find canonical .bpc examples by topic keywords and/or chart type.' It specifies the verb, resource, and search criteria, and distinguishes itself from the sibling get_example by noting it returns pointers rather than full DSL.
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 explicitly instructs the agent to 'call get_example with an id to fetch the full DSL', providing a clear alternative and follow-up step. This establishes when to use this tool (for finding pointers) versus get_example (for fetching full content).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_dslARead-onlyIdempotent
Parse and semantically validate a .bpc source. Returns { valid, errors[], warnings[] }. Errors include unknown chart types, unknown properties, and empty data blocks with nearest-neighbour suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | The .bpc chart source to parse and validate. |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | Yes | True when the source parses and passes semantic validation. |
| errors | Yes | Fatal structural and value-level errors. |
| warnings | Yes | Non-fatal advisories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint, idempotentHint, and openWorldHint false, the description adds valuable behavioral context: it discloses the exact return shape ({ valid, errors[], warnings[] }) and details the categories of errors (unknown chart types, unknown properties, empty data blocks with nearest-neighbour suggestions). This goes beyond the annotations and helps the agent understand what to expect.
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 three concise sentences that immediately communicate the core action, return type, and error categories. No filler or repetition. Every sentence adds distinct value, and the structure front-loads the primary purpose.
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 single-parameter validation tool, the description is fully complete: it mentions the return structure, specific error types, and semantically hints at the validation scope. The presence of an output schema further reduces the need to explain return fields. The annotations cover side-effect safety, so no further detail is needed.
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 100% and the schema's parameter description ('The .bpc chart source to parse and validate.') already conveys the meaning. The tool description reinforces the same without adding extra semantics like format constraints or examples. Baseline 3 is appropriate since the schema carries the load.
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 clearly states a specific verb+resource: 'Parse and semantically validate a .bpc source.' It distinguishes itself from siblings like 'inspect_dsl' by emphasizing semantic validation and the return structure of valid/errors/warnings, which is unique among the listed tools.
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 implies usage for validating .bpc sources before rendering or exporting, but it does not explicitly state when to use this tool versus alternatives like 'inspect_dsl' or 'recommend_chart_type'. No 'when-to-use' or 'alternatives' guidance is provided, only the tool's action.
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. Dates show when Glama detected each change.
11 tool updates
v0.2.0- First observed
describe_chart_type - First observed
export_chart - First observed
get_example - First observed
get_grammar - First observed
inspect_dsl - First observed
list_chart_types - First observed
list_palettes - First observed
recommend_chart_type - First observed
render - First observed
search_examples - First observed
validate_dsl
TDQS
Each tool targets a distinct task: palette listing, DSL validation, inspection, chart type recommendation, grammar reference, rendering, chart type listing/details, example retrieval/search, and export. The only potential overlap is validate_dsl vs. inspect_dsl, but their outputs (errors/warnings vs. structured summary) are clearly different.
Most tool names follow a verb_noun snake_case pattern (e.g., list_palettes, validate_dsl, describe_chart_type). The sole deviation is 'render', a verb-only name, but it remains clear and stylistically consistent with the imperative, lowercase convention.
11 tools is well within the ideal 3-15 range and each tool earns its place in the chart-authoring workflow, covering discovery, validation, rendering, and export without redundancy or bloat.
The tool set provides a complete lifecycle for working with .bpc DSL: discovery (palettes, chart types, examples), guidance (recommend, describe), grammar reference, validation/analysis, rendering, and export. No obvious dead ends or missing operations for the apparent purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Renders interactive Chart.js charts and dashboards inline in AI conversations.
Generate production-ready chart code (Recharts, Chart.js, ECharts, Plotly) from a prompt.
Create, inspect, manage, and render charts and data visualizations as SVG/PNG or interactive embeds.
Verified React chart generation: select, validate, repair, render, and inspect charts through MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to generate safe, runnable HTML chart pages from structured JSON data using Apache ECharts. It provides tools for chart type recommendation, page generation, validation, and patching with controlled, deterministic output.12MIT

Sisense MCP Serverofficial
AlicenseNot gradedqualityBmaintenanceEnables LLMs to interact with Sisense data models and create charts programmatically via natural language, supporting tools for data sources, fields, and chart building.767Cryptographic Autonomy 1.0 (Combined Work Exception)- AlicenseNot gradedqualityNot gradedmaintenanceEnables AI agents to generate beautiful, presentation-ready charts (SVG + PNG) with zero setup, supporting various chart types and styling options.25MIT
- AlicenseBqualityDmaintenanceEnables AI agents to render branded charts as inline images and persistent hosted URLs, supporting explicit chart types and automatic chart suggestion from data.260MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/blueprint-chart/mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server