System · Compute API · MCP
LiveThe solvers are callable, not just readable.
Every calculator on this site is a pure function, and 5 of them are served as tools — over the Model Context Protocol for agents, and as plain GET endpoints for everything else. No key, no signup, no account. Each answer comes back with the URL of the published page that states the same numbers, so a model that cites it can be checked.
API 1.0.0 • Stateless streamable HTTP • No auth • CORS * • Free with attribution
Connect an agent in one command
The endpoint speaks streamable HTTP in single-JSON-response mode, so any MCP client that supports an HTTP transport can use it today without installing anything.
Claude Code
claude mcp add --transport http makerportal https://makerportal.ai/api/mcp
claude mcp list should then show it as connected.
Any client with a JSON config
{
"mcpServers": {
"makerportal": {
"type": "http",
"url": "https://makerportal.ai/api/mcp"
}
}
}Clients that only speak stdio need a local shim process. That package is not published yet, so for now use a client with HTTP transport — the endpoint itself is the whole server.
Or just POST to it
No initialize handshake is required and there are no sessions, so a single POST is a complete interaction.
List the tools
curl -s -X POST https://makerportal.ai/api/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Call one
curl -s -X POST https://makerportal.ai/api/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"roomModes",
"arguments":{"width":12,"length":16,"height":8}}}'What comes back
Solved on this build by the same function that rendered the page it points at — not a hand-written sample.provenance.canonicalUrl is the whole point: it names the published page stating these exact numbers, or the lane hub when the inputs are off the published grid, so an answer quoted from here can always be traced to something a human can read.
{
"inputs": {
"widthFt": 12,
"lengthFt": 16,
"heightFt": 8,
"maxFreqHz": 300,
"slug": "12x16x8"
},
"result": {
"spec": {
"widthFt": 12,
"lengthFt": 16,
"heightFt": 8
},
"volumeM3": 43.49467636531201,
"fundamentals": [
{
"axis": "length",
"freq": 35.166502624671914
},
{
"axis": "width",
"freq": 46.88867016622922
},
{
"axis": "height",
"freq": 70.33300524934383
}
],
"worstAxialGapHz": 35.16650262467192,
"modeCounts": {
"axial": 18,
"tangential": 76,
"oblique": 81,
"total": 175
},
"…": "plus the ratio, Schroeder crossovers and pile-ups"
},
"provenance": {
"method": "Rectangular-room eigenmode solution f = (c/2)·sqrt((nx/Lx)² + (ny/Ly)² + (nz/Lz)²) at c = 343 m/s, with axial/tangential/oblique classification, pile-up clustering below 200 Hz, the Bolt-area proportion test (Bolt, 1946, JASA), and Schroeder crossovers at two ASSUMED RT60 values. Pure geometry — no material data is involved, which is why RT60 is bracketed rather than stated.",
"canonicalUrl": "https://makerportal.ai/lab/room-modes/12x16x8"
},
"license": "free-with-attribution"
}The tools
Each one is the identical function that renders its published pages, assigned by reference in a single registry, so an answer here and an answer on the page cannot disagree. Every example below is a real request.
| Tool | What it solves | Try it |
|---|---|---|
| biquadDesign | Design one RBJ-cookbook biquad and report its numerical behaviour. | /api/v1/biquad-design?type=lowpass&freq=1000 |
| roomModes | Solve the eigenmodes of a rectangular room. | /api/v1/room-modes?width=12&length=16&height=8 |
| llmVramFit | Decide whether one LLM fits one accelerator, at every quantization. | /api/v1/llm-vram-fit?model=llama-3-1-8b-instruct&gpu=rtx-4090 |
| solenoidField | Solve the on-axis magnetic field of an air-core solenoid. | /api/v1/solenoid-field?diameter=25&length=100 |
| roomShapeBand | Solve the best rectangular room proportions for a given volume. | /api/v1/room-shape-band?volume=2400 |
What it does not do
No sessions, no stream
GET /api/mcp answers 405 and so doesDELETE. Both are correct, not faults: there is no SSE stream in single-JSON-response mode and there are no sessions to end. A fabricatedMcp-Session-Id changes nothing.
No proxying, no relay
There is no market-data relay and no model behind any of these. They are own-solver computation only and no request leaves the function, which is why an answer can be handed back with a citation rather than a disclaimer.
Rate limiting is best-effort
A 429 is a per-instance courtesy limit, not a quota: there is no shared counter, and identical/api/v1 requests are served from the edge cache without reaching a function at all.
Non-finite numbers are strings
A notch is −∞ dB at its centre and a low-pass is −∞ dB at Nyquist. JSON has no literal for that andnull would be a different claim, so those arrive as the strings "Infinity","-Infinity" and"NaN". They are documented in the OpenAPI schema.
Licence. Free to use and to quote with attribution and a link to the canonical page each answer names. Full terms at /terms; if you are building something with it, say hello.