mcp server

Suspension design your AI agent can drive.

bellcrank exposes a remote MCP server. Connect your agent, and it builds the axle, runs the rig and reads the solver's channels back — the same API your own scripts use, with the same rules.

  • Claude Code
  • Cursor
  • Any MCP client with a key header
  • Every plan

Exhibit 002

The hand-clicked parameter sweep

one GUI, one engineer, one run at a time

Change a hardpoint, click Run, export to spreadsheet, paste, repeat. Survived every software generation on habit alone.

Superseded by a tool call.

the loop

From catalog to curves, in tool calls.

When a client connects, the server hands it the recommended order of calls, so your agent can start at the right tool.

  1. Pick a topology.

    list_templates indexes the catalog, and your agent pulls the full structure of the option it picks.

  2. Build it.

    create_axle builds the axle from that topology. A saved motion defines the sweep to run.

  3. Run it.

    run_kinematics queues the run and answers at once. A wait tool does the polling for your agent.

  4. Read it.

    get_result starts with a compact summary, then pulls back just the channels your agent asks for.

You: On "FS26 front", raise both upper-wishbone inner pivots by 5 mm. Compare roll center height, camber gain and bump steer over ±50 mm of heave, before and after.

whoami() list_assets(kind="axle") # "FS26 front" list_assets(kind="motion") # "Heave ±50 mm", two_post_rig run_kinematics(runs=[{type:"two_post_rig", assembly_id:"3f2c…", motion_id:"9a41…"}]) wait_for_result(result_id="c07e…") # complete — baseline get_asset(kind="axle", id="3f2c…") # definitions + revision_checksum update_axle(id="3f2c…", patch={ definitions:{suspension:{…, values:{…, "double_wishbone.point.uca_inner_fore_l.position": [x, y, z+0.005], …}}}, parent_checksum:"e81b…"}) # all four uca_inner points, +5 mm in z run_kinematics(runs=[{type:"two_post_rig", assembly_id:"3f2c…", motion_id:"9a41…"}]) wait_for_result(result_id="d5a2…") # complete — revision 2 get_result(result_id="c07e…", channels=[ "axle.roll_center_z", "front.wheel.camber_gain_wheel_l_post_l", "front.wheel.toe_wheel_l", "front.wheel.wheel_travel_wheel_l"]) get_result(result_id="d5a2…", channels=[…same four…])

Agent: Roll center height, camber gain and bump steer (toe against wheel travel), for both revisions, side by side.

Illustrative session. Tool names and argument shapes match the live server. Ids are shortened, and no results are shown.

Ask it things like

  • "Sweep ±30 mm of roll on FS26 front. How far does the roll center move, sideways and vertically?"

  • "Drop both tie-rod inner points 3 mm and show toe against wheel travel before and after."

  • "On the FS26 car, what anti-dive and anti-squat do we have over ±40 mm of heave?"

resources and prompts

Context your agent doesn't have to guess.

Attach the guide and the channel vocabulary once, and a single prompt starts the whole loop for you.

Resources: attach once.

bellcrank://guide
The API guide, so your agent gets the calling convention right from the first call.
bellcrank://channels
The full channel vocabulary, so it knows what it can ask for before it runs anything.
bellcrank://templates/{name}
Any topology's full structure and defaults, ready to build from.

Prompts: one line to start.

run-and-summarize
Builds an axle from a template, runs a heave sweep, and summarizes camber and toe in plain language.
compare-revisions
Walks an axle's saved results by revision and describes what changed.

connect

One key. One command.

Mint a key under Account → API keys, then add the server:

bash
claude mcp add --transport http bellcrank https://api.bellcrank.io/mcp \
  --header "Authorization: Bearer bc_api_..."

Cursor and any other client that can send a header use the same URL. More in the MCP guide

faq

Before you connect.

Which clients work?

Claude Code, Cursor and any other MCP client that can send a static header connect the same way: one URL and an API key, no browser sign-in.

Where do the numbers come from?

bellcrank's solver computes every channel, and the tool reads it back. Your agent chooses what to run and which channels to read.

Does MCP cost extra?

No. A queued run spends credits from your normal pool, the same as it would from the app.

Can the free plan use it?

Yes. Every plan can mint a key and connect an agent; your plan's usual limits still apply.

Will a large result flood my agent's context?

No. A result starts as a compact summary, and an answer too large to be useful is refused with a hint to narrow it, never dumped in full.

Can my agent delete things?

Yes, and every delete is marked destructive, so a client that honors annotations asks you first.

Start free

Give your agent a suspension to solve.

Create an account, mint a key, run one command. The free tier is permanent and needs no payment details.