Skip to main content
Glama
blueprint-chart

blueprint-chart/mcp

Status

CI checks

Github Actions

Latest version

Latest version

Release date

Release date

Open issues

Open issues

Websites

Editor Docs

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:4321

Related 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/mcp

Tools

Tool

Purpose

validate_dsl

Parse .bpc; returns { valid, errors[], warnings[] } — each error has code, message, suggestion

inspect_dsl

Parse and summarize: chartType, scenes, seriesCount, rowCount, hasHighlights, hasColorizes, etc.

recommend_chart_type

Rank chart types for a given column shape and row count

render

Render to SVG (default), PNG, or HTML; with format:"png" returns an inline image both you and the user can see. Always returns structured frame metadata. When MCP_PUBLIC_URL is set, includes urls ({png,svg,bpc}) — stateless links where the chart data travels inside the URL. Set modelVisible:false to drop the inline image from the response entirely, spending no image tokens. Pass save:<path> to write the output to disk (requires MCP_FS_WRITE_DIR; writes are confined to that directory). Width/height capped at 1600; PNG is 2× retina.

list_chart_types

List all renderable chart types (tool equivalent of bpc://handbook/choosing)

describe_chart_type

Properties, when-to-use, when-NOT-to-use, and data-shape for one chart type (tool equivalent of bpc://chart-types/{slug})

get_example

Fetch a canonical .bpc sample by chart type or sample name (tool equivalent of bpc://samples/{id})

search_examples

Find canonical examples by topic keywords and/or chart type (returns pointers; fetch full DSL with get_example)

get_grammar

Full DSL syntax reference (tool equivalent of bpc://grammar)

list_palettes

List named colour palettes with hex colours for colorPalette

export_chart

Validate a .bpc and return shareable URLs plus an inline preview. Returns { copyUrl, embedUrl, urls?, frame }copyUrl is editable in the editor, embedUrl is a read-only iframe target, urls.{png,svg,bpc} are stateless rendered/source links (when MCP_PUBLIC_URL is set). Set modelVisible:false to drop the inline preview from the response entirely, spending no image tokens. Requires BLUEPRINT_CHART_EDITOR_URL; preview failures never block the export.

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/mcp

Resources

  • bpc://grammar — full DSL syntax reference

  • bpc://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 docs

  • bpc://samples/<id> — canonical .bpc examples

  • bpc://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, calls validate_dsl to confirm it parses, calls render with format: '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 suggestionand 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 tools
describe_chart_typeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chartTypeYesA chart type or alias to describe, e.g. "bar-horizontal" or "line".

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesCanonical chart-type identifier.
aliasesYesAccepted alias names.
docsUrlNoPublic docs URL.
summaryYesOne-line description.
dataShapeYesThe data shape this chart type expects.
whenToUseYesSituations this chart type fits.
directivesYesSupported directives.
propertiesYesSupported chart properties.
exampleSlugNoId of a canonical sample for this type.
whenNotToUseYesSituations to avoid it.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_chartA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesThe .bpc chart source to validate and publish to shareable URLs.
modelVisibleNoWhen false, the preview image is shown to the user but not sent to the model.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlsNoStateless hosted render URLs (only when MCP_PUBLIC_URL is set).
frameYesFrame metadata extracted from the chart.
copyUrlYesEditor URL that opens an editable copy of the chart.
embedUrlYesRead-only iframe-embeddable URL.
previewOmittedNoSet when the scene-0 preview render failed.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_exampleA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoReturn a specific sample by its id, e.g. "co2-emissions".
chartTypeNoReturn the first canonical sample for this chart type (or alias).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesSample id.
dslYesThe full .bpc source of the sample.
titleYesSample title.
chartTypeYesChart type of the sample.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_grammarC
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNoLimit to one grammar section: "chart", "properties", "scenes", or "annotations". Omit (or "all") for the full grammar.all

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYesThe grammar reference as markdown.
sectionYesThe grammar section returned.

TDQS

C2.9/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_dslA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesThe .bpc chart source to parse and summarize.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesSummary of the data block.
scenesYesPer-scene summaries (always at least one).
chartTypeYesDeclared chart type.
seriesCountYesNumber of series.
hasAreaFillsYesWhether any area-fill is present.
hasColorizesYesWhether any non-highlight colorize is present.
hasHighlightsYesWhether any highlight is present.
hasAnnotationsYesWhether any annotation/range/note is present.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_typesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
chartTypesYesEvery renderable chart type.

TDQS

A4.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_palettesA
Read-onlyIdempotent

List every named colour palette with its label and hex colours, for use in colorPalette = "<name>".

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
palettesYesEvery named palette.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_typeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalNoOptional prose sentence describing what the chart should show. Determines the chart family (comparison / ranking / part-to-whole / composition-over-time / trend / range).
rowCountYesNumber of data rows in the dataset.
columnTypesYesThe type of each data column, in order: "string", "number", or "date".

Output Schema

ParametersJSON Schema
NameRequiredDescription
guidanceNoProse next-step guidance for the top recommendation.
recommendationsYesRanked chart-type recommendations, best first.

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

renderA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
saveNoOptional 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.
sceneNoZero-based scene index to render, for charts that define scenes. Omit for the base chart (scene 0).
widthNoOutput width in pixels (max 1600). PNGs are rasterized at 2x for retina sharpness.
formatNoOutput format. "svg" (default) and "html" return text; "png" returns an inline image you and the user can both see.svg
heightNoOutput height in pixels (max 1600).
sourceYesThe .bpc chart source to render.
modelVisibleNoWhen false, the inline PNG is shown to the user but not sent to the model (saves image tokens on bulk renders).

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlsNoStateless hosted render URLs (only when MCP_PUBLIC_URL is set).
frameYesFrame metadata extracted from the chart.
savedToNoAbsolute path the output was written to, when `save` was used.
mimeTypeYesMIME type of the rendered output.
urlsOmittedNoSet when URLs were omitted because the source exceeded the URL cap.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_examplesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (max 20).
queryNoTopic keywords to match against sample titles and descriptions.
chartTypeNoRestrict results to this chart type (or alias).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYesRanked sample pointers, best first.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_dslA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesThe .bpc chart source to parse and validate.

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYesTrue when the source parses and passes semantic validation.
errorsYesFatal structural and value-level errors.
warningsYesNon-fatal advisories.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 11 tool updatesv0.2.0
    • First observeddescribe_chart_type
    • First observedexport_chart
    • First observedget_example
    • First observedget_grammar
    • First observedinspect_dsl
    • First observedlist_chart_types
    • First observedlist_palettes
    • First observedrecommend_chart_type
    • First observedrender
    • First observedsearch_examples
    • First observedvalidate_dsl

TDQS

A4/5.0
Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables LLMs to interact with Sisense data models and create charts programmatically via natural language, supporting tools for data sources, fields, and chart building.
    76
    7
    Cryptographic Autonomy 1.0 (Combined Work Exception)
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI agents to generate beautiful, presentation-ready charts (SVG + PNG) with zero setup, supporting various chart types and styling options.
    25
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to render branded charts as inline images and persistent hosted URLs, supporting explicit chart types and automatic chart suggestion from data.
    2
    60
    MIT

Latest Blog Posts

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