[{"data":1,"prerenderedAt":58},["ShallowReactive",2],{"doc-index":3},{"blocks":4,"markdown":57},[5,8,10,12,38,40],{"kind":6,"html":7},"html","\u003Cp>Forma is an API and an MCP server that turns a request in plain language into a\nchart or a figure you can use directly — Vega-Lite, Plotly, ECharts, Chart.js or\ngnuplot for a chart; TikZ, PicTeX or MetaPost for a figure. Forma checks every artifact against a versioned set of rules before it reaches you.\nSo instead of checking it yourself, you get an artifact that passed, with the\nversion of the rules it passed — or \u003Ccode class=\"chip chip--invalid\">invalid\u003C\u002Fcode>, with the reason. The rules\nthemselves are not published.\u003C\u002Fp>\n\u003Cp>It checks form, not meaning: a valid chart of the wrong column is still valid.\nYou ask an \u003Cstrong>oracle\u003C\u002Fstrong> — \u003Ccode>chart\u003C\u002Fcode>, \u003Ccode>vector-graphics\u003C\u002Fcode> or \u003Ccode>coverage-policy\u003C\u002Fcode> — see \u003Ca href=\"\u002Foracles\">Oracles\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>The quickest way to try it is from the assistant you already use:\u003C\u002Fp>\n",{"kind":9},"connect",{"kind":6,"html":11},"\u003Cp>Calling it from code instead? Start with the \u003Ca href=\"\u002Fquickstart\">Quickstart\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"what-comes-back\">What comes back\u003C\u002Fh2>\n\u003Cp>Every call returns a verdict — \u003Ccode class=\"chip chip--valid\">valid\u003C\u002Fcode>, \u003Ccode class=\"chip chip--invalid\">invalid\u003C\u002Fcode> or \u003Ccode class=\"chip chip--error\">error\u003C\u002Fcode>. A \u003Ccode class=\"chip chip--valid\">valid\u003C\u002Fcode> one\ncarries a \u003Cstrong>citation\u003C\u002Fstrong>, \u003Ccode>verified_by\u003C\u002Fcode>, identifying the version of the rules it passed. Below are real\nanswers exactly as returned, each picture beside the source code it was drawn\nfrom. What each verdict means is on \u003Ca href=\"\u002Fverdicts\">Verdicts\u003C\u002Fa>.\u003C\u002Fp>\n",{"kind":13,"ids":14,"captures":17},"verdict",[15,16],"candlestick","triangle",[18,29],{"oracle":19,"format":20,"status":21,"verified_by":22,"captured":23,"intent":24,"id":15,"title":25,"source":26,"image":27,"imageDark":28},"chart","vega-lite","valid","chart@6baf09f0","2026-09-28","A candlestick chart of a stock over 20 trading days: a thin rule from low to high and a bar from open to close for each day, green when close is above open and red when below. The price axis must not start at zero; scale it to the price range (about 95 to 125) so the candles are tall and readable.","20-Day Stock Candlestick Chart","{\n  \"$schema\": \"https:\u002F\u002Fvega.github.io\u002Fschema\u002Fvega-lite\u002Fv6.json\",\n  \"name\": \"stock_candlestick\",\n  \"data\": {\n    \"values\": [\n      {\n        \"day\": \"2026-01-05\",\n        \"low\": 98,\n        \"open\": 100,\n        \"close\": 104,\n        \"high\": 107,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-06\",\n        \"low\": 101,\n        \"open\": 104,\n        \"close\": 102,\n        \"high\": 106,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-07\",\n        \"low\": 99,\n        \"open\": 102,\n        \"close\": 106,\n        \"high\": 109,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-08\",\n        \"low\": 104,\n        \"open\": 106,\n        \"close\": 110,\n        \"high\": 112,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-09\",\n        \"low\": 107,\n        \"open\": 110,\n        \"close\": 108,\n        \"high\": 113,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-12\",\n        \"low\": 105,\n        \"open\": 108,\n        \"close\": 113,\n        \"high\": 116,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-13\",\n        \"low\": 110,\n        \"open\": 113,\n        \"close\": 111,\n        \"high\": 115,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-14\",\n        \"low\": 108,\n        \"open\": 111,\n        \"close\": 116,\n        \"high\": 119,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-15\",\n        \"low\": 113,\n        \"open\": 116,\n        \"close\": 118,\n        \"high\": 121,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-16\",\n        \"low\": 115,\n        \"open\": 118,\n        \"close\": 114,\n        \"high\": 120,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-19\",\n        \"low\": 111,\n        \"open\": 114,\n        \"close\": 117,\n        \"high\": 119,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-20\",\n        \"low\": 114,\n        \"open\": 117,\n        \"close\": 121,\n        \"high\": 124,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-21\",\n        \"low\": 118,\n        \"open\": 121,\n        \"close\": 119,\n        \"high\": 123,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-22\",\n        \"low\": 116,\n        \"open\": 119,\n        \"close\": 115,\n        \"high\": 122,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-23\",\n        \"low\": 112,\n        \"open\": 115,\n        \"close\": 118,\n        \"high\": 120,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-26\",\n        \"low\": 115,\n        \"open\": 118,\n        \"close\": 122,\n        \"high\": 125,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-27\",\n        \"low\": 119,\n        \"open\": 122,\n        \"close\": 120,\n        \"high\": 124,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-28\",\n        \"low\": 117,\n        \"open\": 120,\n        \"close\": 116,\n        \"high\": 121,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-29\",\n        \"low\": 113,\n        \"open\": 116,\n        \"close\": 119,\n        \"high\": 121,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-30\",\n        \"low\": 116,\n        \"open\": 119,\n        \"close\": 123,\n        \"high\": 125,\n        \"direction\": \"up\"\n      }\n    ]\n  },\n  \"title\": \"20-Day Stock Candlestick Chart\",\n  \"layer\": [\n    {\n      \"mark\": {\n        \"type\": \"rule\",\n        \"size\": 1\n      },\n      \"encoding\": {\n        \"x\": {\n          \"field\": \"day\",\n          \"type\": \"ordinal\"\n        },\n        \"y\": {\n          \"field\": \"low\",\n          \"type\": \"quantitative\",\n          \"scale\": {\n            \"zero\": false,\n            \"domain\": [\n              95,\n              125\n            ]\n          },\n          \"axis\": {\n            \"title\": \"Price\"\n          }\n        },\n        \"y2\": {\n          \"field\": \"high\",\n          \"type\": \"quantitative\"\n        }\n      }\n    },\n    {\n      \"mark\": \"bar\",\n      \"encoding\": {\n        \"x\": {\n          \"field\": \"day\",\n          \"type\": \"ordinal\"\n        },\n        \"y\": {\n          \"field\": \"open\",\n          \"type\": \"quantitative\",\n          \"scale\": {\n            \"zero\": false,\n            \"domain\": [\n              95,\n              125\n            ]\n          },\n          \"axis\": {\n            \"title\": \"Price\"\n          }\n        },\n        \"y2\": {\n          \"field\": \"close\",\n          \"type\": \"quantitative\"\n        },\n        \"color\": {\n          \"field\": \"direction\",\n          \"type\": \"nominal\",\n          \"scale\": {\n            \"domain\": [\n              \"up\",\n              \"down\"\n            ],\n            \"range\": [\n              \"green\",\n              \"red\"\n            ]\n          }\n        }\n      }\n    }\n  ]\n}","\u002Fimages\u002Fcaptures\u002Fcandlestick.svg","\u002Fimages\u002Fcaptures\u002Fcandlestick.dark.svg",{"oracle":30,"format":31,"status":21,"verified_by":32,"captured":33,"intent":34,"id":16,"title":35,"source":36,"image":37},"vector-graphics","tikz","vector-graphics@c738bf88","2026-09-30","A right triangle with legs 3 and 4 and hypotenuse 5, each side labelled with its length, and the right angle marked with a small square.","Right triangle, sides 3, 4 and 5","\\begin{tikzpicture}[x=1pt,y=1pt]\n  \\path[use as bounding box] (0,0) rectangle (294.56,234.83);\n  \\draw[draw=black!45,line width=0.4pt] (39.75,20.5) -- (39.75,43.25) -- (17,43.25);\n  \\draw[draw=black,line width=0.6pt,fill=none] (17,20.5) -- (277,20.5) -- (17,215.5) -- cycle;\n  \\draw[draw=black,line width=0.6pt] (17,20.5) -- (277,20.5);\n  \\draw[draw=black,line width=0.6pt] (17,20.5) -- (17,215.5);\n  \\draw[draw=black,line width=0.6pt] (277,20.5) -- (17,215.5);\n  \\filldraw[draw=none,line width=0.4pt,fill=black] (17,20.5) circle[radius=1.3pt];\n  \\filldraw[draw=none,line width=0.4pt,fill=black] (277,20.5) circle[radius=1.3pt];\n  \\filldraw[draw=none,line width=0.4pt,fill=black] (17,215.5) circle[radius=1.3pt];\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (11.67,13.42) {$a$};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (283.78,20.5) {$b$};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (11.95,222.58) {$c$};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (147,12.25) {4};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (10.5,118) {3};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (151.9,125.45) {5};\n\\end{tikzpicture}\n","\u002Fimages\u002Fcaptures\u002Ftriangle.svg",{"kind":6,"html":39},"\u003Ch2 id=\"where-next\">Where next\u003C\u002Fh2>\n",{"kind":41,"cards":42},"cards",[43,48,52],{"title":44,"href":45,"body":46,"eyebrow":47},"Quickstart","\u002Fquickstart","Your assistant in a minute, or a key and one call from code.","Get started",{"title":49,"href":50,"body":51,"eyebrow":47},"How Forma works","\u002Fhow-oracles-work","What a verdict promises, and what it does not.",{"title":53,"href":54,"body":55,"eyebrow":56},"Every endpoint","\u002Fauthentication","Keys, errors, limits and the full HTTP API.","API Reference","# Introduction\n\n> Ask for a chart or a figure in plain language. Get it back checked, or get a plain no.\n\nForma is an API and an MCP server that turns a request in plain language into a\nchart or a figure you can use directly — Vega-Lite, Plotly, ECharts, Chart.js or\ngnuplot for a chart; TikZ, PicTeX or MetaPost for a figure. Forma checks every artifact against a versioned set of rules before it reaches you.\nSo instead of checking it yourself, you get an artifact that passed, with the\nversion of the rules it passed — or `invalid`, with the reason. The rules\nthemselves are not published.\n\nIt checks form, not meaning: a valid chart of the wrong column is still valid.\nYou ask an **oracle** — `chart`, `vector-graphics` or `coverage-policy` — see [Oracles](https:\u002F\u002Fdocs.formalogic.io\u002Foracles).\n\nThe quickest way to try it is from the assistant you already use:\n\nConnect an assistant: add the remote MCP server https:\u002F\u002Fmcp.formalogic.io\u002Fmcp (no API key; you sign in with your Forma account). Or paste this into any agent:\n\n```\nConnect to Forma, a remote MCP server at https:\u002F\u002Fmcp.formalogic.io\u002Fmcp. Add it as a remote HTTP MCP server named \"forma\" with no API key: it uses OAuth, so I will sign in with my Forma account in the browser when you connect. If you need the exact steps for this client, read https:\u002F\u002Fdocs.formalogic.io\u002Fconnect. Once connected, call forma_status and tell me which account you are connected as, then call list_oracles to show what you can ask.\n```\n\nCalling it from code instead? Start with the [Quickstart](https:\u002F\u002Fdocs.formalogic.io\u002Fquickstart).\n\n## What comes back\n\nEvery call returns a verdict — `valid`, `invalid` or `error`. A `valid` one\ncarries a **citation**, `verified_by`, identifying the version of the rules it passed. Below are real\nanswers exactly as returned, each picture beside the source code it was drawn\nfrom. What each verdict means is on [Verdicts](https:\u002F\u002Fdocs.formalogic.io\u002Fverdicts).\n\n\n## Where next\n\n- [Quickstart](https:\u002F\u002Fdocs.formalogic.io\u002Fquickstart): Your assistant in a minute, or a key and one call from code.\n- [How Forma works](https:\u002F\u002Fdocs.formalogic.io\u002Fhow-oracles-work): What a verdict promises, and what it does not.\n- [Every endpoint](https:\u002F\u002Fdocs.formalogic.io\u002Fauthentication): Keys, errors, limits and the full HTTP API.\n",1793819973841]