Forma Visuals · Chart your data · For developers

Charts that arrive with a verdict your code can act on.

Ask for a chart over MCP or HTTP and get valid, invalid or error, never a maybe. A valid chart carries the version of the rules it passed; an invalid one says why; an error is ours and is never billed.

01 Real answers

A chart API and MCP server for your pipeline.

Line chart, API request latency by hour: p50 and p99, both peaking in the early afternoon
chart · plotly

“Line chart of API request latency over one day, two lines: p50 and p99, in ms, by hour 0 to 23. p50: 42,40,39,38,38,40,45,58,72,80,84,86,85,88,90,87,83,76,64,55,50,47,45,43. p99: 120,115,110,108,110,118,140,190,260,310,330,345,338,352,365,350,320,280,220,180,160,145,135,125. x axis: hour of day, y axis: latency (ms).”

valid · chart@6baf09f0

Try these with their values filled in:

The playground allows illustrative values: any number your request does not give, Forma writes, and the answer says generated. Over the API and MCP, that request is refused unless it sets allow_generated_data.

02 How it fits

Into the work you already do.

One call, three outcomes

Every answer has a status: valid, with the code and the rules version it passed; invalid, with the reason; or error, which is ours, unbilled and safe to retry.

Gate CI on it

An invalid answer can fail the build, so a chart that does not pass the check stops there instead of shipping.

Gate CI on a verdict →

Connect an agent

Point Claude, ChatGPT, Cursor, VS Code, Windsurf or Codex at the MCP server and sign in when it asks.

Connect your agent →

Formats

Vega-Lite, Plotly, ECharts, Chart.js and gnuplot. Name one in the request, or the default is used.

03 What you still check

What a verdict does not tell you.

  • Numbers the chart computes from yours, such as totals, averages or a calculated field, are not compared, and neither are row numbers that only count the rows.
  • Labels and dates are not compared with your request, and the check does not confirm that every row is drawn or sits in the right place. Read the chart before you publish it.
  • With generated data allowed, a vague request such as “Make me a chart about how things are going.” comes back valid, with values Forma wrote, and the answer says so.
  • The check covers form, not intent: a valid chart of the wrong column is still valid.

04 Questions

Before you start.

Is an error billed?

No. An error is ours and is never billed. A valid and an invalid verdict each cost one credit, $0.01.

Is the same request always answered the same way?

No. Two identical requests can return two different valid charts, and asking twice can return valid once and invalid the next, so store the answer you use. A valid chart names the version of the rules it passed.

Which clients connect over MCP?

Claude, ChatGPT, Cursor, VS Code, Windsurf and Codex. Code calls the same API over HTTP with a key.