Feeling sure is not the same as being sure.

LLMs make things that look right. Forma hands back things that passed. In seconds, or with a plain no.

Starting with charts and figures · see what is live →

A line chart of monthly active users in 2025, months Jan to Dec in calendar order on x (not alphabetical), users in thousands on y: 12.4, 13.1, 14.8, 15.2, 16.9, 18.3, 17.6, 18.9, 21.2, 22.8, 24.1, 26.5. Title: Monthly active users, 2025.

Recorded from production · 2026-10-01 · each step is a real call you can make

  1. 01

    Read the catalogue rather than guess a name. Free.

    list_oracles {}

    → 3 oracles · chart, vector-graphics, coverage-policy

  2. 02

    The chart is checked against its rules, and against what Chart.js can draw, before it answers.

    ask_oracle · chart · chartjs · the intent above

    → valid · chart@6baf09f0 · 1 credit

Line chart of monthly active users through 2025, in thousands, rising from 12.4 in January to 26.5 in December

Drawn by Chart.js from the returned config. Chart.js is not drawn by Forma's servers: the answer is the config, and your page draws it. The numbers are the ones given in the prompt, January's 12.4 thousand to December's 26.5.

01 Why Forma

Ask for it. Get it back checked.

01

Models sound certain.

Ask a model for code, a configuration, a diagram or a report, and the answer comes back fluent and confident, whether it is right or not.

02

You feel like you can trust it. You know you can't.

So you check every answer by hand, or you ship it and hope nobody looks closely.

03

Forma gives you a reason to trust it.

Every answer that passes says which version of the rules it passed. If it cannot pass, you are told, plainly.

02 Who it is for

Wherever model output has to be right.

Teams building agents

Give an agent tools whose answers are checked, so it can act on them without a person reading every one.

Products and pipelines

Put model output into a product or a build with a verdict a program can act on: valid, invalid or error.

Anyone who publishes it

Reports, papers, docs, slides. When your name is on it, “it looked right” is not enough.

Teams who answer for it

Keep the rules version with the output, and you can say later exactly which version it passed.

03 Live today

Starting with charts and figures.

The first two products: charts in Vega-Lite, Plotly, ECharts, Chart.js or gnuplot, and figures in TikZ, MetaPost or PiCTeX. Each answer below is real, shown with the request that produced it, and every number in each chart's data is in its request. The tag beside each answer, such as chart@6baf09f0, is the version of the rules it passed.

Line chart of monthly active users through 2025, in thousands
chart · chartjs

“A line chart of monthly active users in 2025, months Jan to Dec in calendar order on x (not alphabetical), users in thou…”

valid · chart@6baf09f0

For analysts →
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,4…”

valid · chart@6baf09f0

For developers →
Scatter plot of car weight against fuel economy, petrol and diesel
chart · plotly

“A scatter plot of car weight against fuel economy, two groups as separately coloured marker series with a legend. Petrol…”

valid · chart@6baf09f0

For students and scientists →
A binary search tree with root 8 built from the keys 8, 3, 10, 1, 6, 14, 4, 7, 13
vector-graphics · tikz

“A binary search tree built by inserting the keys 8, 3, 10, 1, 6, 14, 4, 7, 13 in that order. Draw each node as a circle…”

valid · vector-graphics@c738bf88

For researchers →
A Merkle tree: Root = H(ABCD) over H(AB) and H(CD), over H(A) to H(D), over data blocks A to D
vector-graphics · tikz

“A Merkle tree over four data blocks. Leaves: H(A), H(B), H(C), H(D) as boxes. Their parents: H(AB) above H(A) and H(B),…”

valid · vector-graphics@c738bf88

For researchers →
Triangle ABC with its three medians meeting at the centroid GEach median runs from a vertex to the midpoint of the opposite side: A to M_A, B to M_B, C to M_C. All three pass through G.ABCMAMBMCG
vector-graphics · tikz

“Triangle ABC with the midpoints of each side, the three medians, and the centroid G where they meet; check that each med…”

valid · vector-graphics@c738bf88

For educators →

These are the first two. What should Forma check next? Tell us what your models write.

04 Limits

Read this before you rely on it.

What “valid” means: the check covers form, not intent. A valid chart of the wrong column is still valid. Real answers, two valid and one refused:

AskedGotSo
“Make me a chart about how things are going.”valid · chart@6baf09f0
a line chart of five weeks of counts
Captured before the API refused such requests by default: Forma made the numbers up. Today the API refuses it with DATA_REQUIRED, unbilled, unless generated data is allowed, as the console allows it.
“Make me a chart about how things are going.”refused · DATA_REQUIRED
“This chart needs values the request does not contain. Put them in the intent, or set allow_generated_data to true for illustrative values.”
HTTP 422, not billed · 2026-10-07
The same request today, sent to the API with its default setting: a plain no and the reason, instead of numbers Forma made up.
“Points A at (0,0), B at (4,0) and C at (2,1). Draw segment AB and point C, and check that A, B and C are collinear.”valid · vector-graphics@c738bf88
C drawn on AB, not above it
The check holds in the figure returned, but Forma moved a coordinate you gave it to make it hold. Read the source before trusting the picture.
per call

$0.01

billed

valid · invalid

never billed

error

credits

never expire

05 Start

Start in the browser, or from your agent.

Free plan: 20 calls a month, every product, every format. Try it in the console, or connect your agent with one line and sign in when it asks.

Claude Code
claude mcp add --transport http forma https://mcp.formalogic.io/mcp

Other clients and the HTTP API