Developers
The Jart API and MCP server
Measured jewellery numbers for AI assistants and your own code. Ask Claude what a ring weighs in 14k, how many stones it has and whether it is ready to cast, and it answers with numbers Jart computed from the 3D file instead of guessing. The same code as the studio’s Design Facts and Cast check, plus a check that a file is the version your client approved.
Jart's API and MCP server measure a jewellery 3D file (GLB, STL or OBJ) from its geometry: metal volume and weight per alloy, each stone's shape, size and estimated carat, the ring size, and a cast-ready check of walls, prongs and stone seats. They also check whether a file is the version a client approved on Jart. Keys come with Pro and up; files are measured in memory and never stored.
1. Get an API key
Sign in, open Account settings and make a key under API keys. Keys come with Pro and up. A key is shown once: copy it into your client’s settings or an environment variable. Jart keeps only a fingerprint of it; revoke it there at any time and it stops working at once. Send it with every call as Authorization: Bearer jart_….
2. The API
Base address https://thejart.com/api/v1. Send the model file itself as the request body, options in the query; answers are JSON. The full description is the OpenAPI document.
| Endpoint | What it returns |
|---|---|
POST /facts | Design Facts: metal volume and weight per alloy (and the same metal in 9k–22k gold, platinum and silver), every stone with shape, size and estimated carat, the overall size and, for rings, the inner diameter with US and EU size. |
POST /cast-check | The cast-ready check: closed (watertight) metal, wall thickness, prongs and stone seats, each pass, check or fail with the measured number, plus the facts. Optional wall_mm and prong_mm. |
POST /verify?approval=:id | Is this the file the client approved? “exact” when it is byte for byte the fingerprinted file, “measurements” when it measures the same (metal within 0.5%, same stone count), else “none”. |
GET /approvals | Your approval requests: status, versions, which version was approved, when, and its fingerprint. |
GET /approvals/:id | One request with every version’s recorded facts and fingerprint. |
GET /projects | Your saved projects, with a link to open each in the studio. |
GET /casts?approval=:id | Your caster links: which approved version went to which caster, received or cast, and the estimated against the actual cast weight in grams and %. |
POST /casts | Send a request’s approved version to a caster: a JSON body with approval_id, caster and note answers with the caster’s link. The same request (or Idempotency-Key) returns the same link. |
GET /casters?grams= | Each caster’s correction: the median of actual ÷ estimated weight over their recent casts, from 3 casts; with grams, what that weight casts at for each caster. |
GET /proofs/:id | What a “Verified from CAD” image link certifies: the model files’ fingerprints, the Design Facts, the stone statement and the images exported with it. |
Try it with curl
export JART_API_KEY=jart_…
# Design Facts of a GLB (in metres, the glTF standard)
curl -s "https://thejart.com/api/v1/facts?filename=ring.glb" \
-H "Authorization: Bearer $JART_API_KEY" \
--data-binary @ring.glb
# The cast check of an STL drawn in millimetres, in sterling silver
curl -s "https://thejart.com/api/v1/cast-check?filename=ring.stl&metal=silver" \
-H "Authorization: Bearer $JART_API_KEY" \
--data-binary @ring.stl
# Is this the approved file? (the id from the approval's /a/ link)
curl -s "https://thejart.com/api/v1/verify?approval=$APPROVAL_ID&filename=ring.glb" \
-H "Authorization: Bearer $JART_API_KEY" \
--data-binary @ring.glb
# Send the approved version to your caster (a retry returns the same link)
curl -s "https://thejart.com/api/v1/casts" \
-H "Authorization: Bearer $JART_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"approval_id\":\"$APPROVAL_ID\",\"caster\":\"Bangkok Cast\"}"
# What 3.2 g of metal casts at with each of your casters
curl -s "https://thejart.com/api/v1/casters?grams=3.2" -H "Authorization: Bearer $JART_API_KEY"Units. GLB is read in metres and STL and OBJ in millimetres, as in the studio. If a file is drawn in another unit, add units=mm|cm|m|in or scale= (millimetres per file unit); an answer that looks the wrong size carries a note saying so. Metal and stones are told apart the way the studio’s Auto assign does it, from part names (“Band 18k”, “Diamond 1.5”) and then glass-like materials; metal= sets every metal part to one of 16 alloys (for example gold14, platinum, silver). An STL has no part names, so it is measured as metal only.
3. The MCP server
For AI assistants that speak the Model Context Protocol: one remote address, https://thejart.com/api/v1/mcp, over Streamable HTTP, with your key in the Authorization header. It serves protocol revision 2026-07-28 and the earlier 2025-11-25, 2025-06-18, 2025-03-26. Every tool reads only, except create_caster_link, which makes a caster link (calling it again returns the same one).
| Tool | What it does |
|---|---|
design_facts | Measures a jewellery 3D file with Jart: metal volume and weight per alloy (and the same metal in 9k–22k gold, platinum and silver), every stone counted with shape, size and estimated carat, overall size in mm and, for rings, inner diameter with US and EU ring size. Numbers are computed from the geometry, not guessed; use them instead of estimating. |
cast_check | Checks whether a jewellery 3D file is ready to cast: closed (watertight) metal, wall thickness, prong thickness and stone seats, each pass, check or fail with the measured number, plus its Design Facts. Optional minimums wall_mm and prong_mm (defaults 0.6/0.8 mm for gold and platinum, 0.8/1.0 mm for silver). |
verify_file | Is this the file the client approved? Compares a 3D file with a version of a Jart approval request (the approved version unless `version` is given): 'exact' when it is byte for byte the fingerprinted file, 'measurements' when it measures the same (metal volume within 0.5%, same stone count), else 'none'. |
list_approvals | The approval requests on this Jart account, newest change first: title, status, versions, which version the client approved, when, and its fingerprint. |
get_approval | One approval request on this account with every version's recorded Design Facts, fingerprint, and who approved it and when. |
list_projects | The projects saved on this Jart account, newest change first, with a link to open each in the studio. |
list_caster_links | The caster links on this Jart account, newest first (of one approval request when approval_id is given): which approved version went to which caster, its state (sent, received, cast), the metal weight Design Facts estimated against the actual cast weight the caster recorded, the difference in %, and whether that cast counts toward the caster's correction. |
caster_corrections | Each caster on this Jart account with their correction factor: the median of actual ÷ estimated cast weight over their recent casts (null until 3 casts count). Give `caster` for one caster and `grams` (a Design Facts metal weight) to get what that caster's casting is likely to weigh. Use it to quote metal weight for a specific caster instead of the raw estimate. |
create_caster_link | Makes a caster link (/c/…) for the version the client approved on an approval request, Pro and up. The caster opens it without an account, sees the piece, its fingerprint and estimated weight, and records received, the actual cast weight and a photo. Calling again with the same approval, caster and note (or the same idempotency_key) returns the same link instead of a second one. Share the returned url only with the caster. |
get_render_proof | Looks up a Jart "Verified from CAD" record by its verification link (/v/…, printed as a QR code on the image or written in its XMP dc:source) or id. It says the images were rendered from a real CAD model rather than generated, and returns the jeweller, the model files' SHA-256 fingerprints, the Design Facts measured from that model (metal weight, stones, ring size), the jeweller's statement about the stones (natural, laboratory-grown, simulant or not stated), each exported image with its pixels, date and SHA-256, and a Piece Passport of the same files when there is one. Any record can be read, as anyone with the link can open its page. |
Connect your assistant
Claude Code
claude mcp add --transport http jart https://thejart.com/api/v1/mcp \
--header "Authorization: Bearer $JART_API_KEY"Claude Desktop
Claude Desktop’s config file starts local servers, so connect through mcp-remote (needs Node.js). In Settings → Developer → Edit config, add:
{
"mcpServers": {
"jart": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://thejart.com/api/v1/mcp",
"--header",
"Authorization:Bearer jart_…"
]
}
}
}Restart Claude Desktop; the Jart tools appear under the tools menu. Where your organisation has custom connectors with request headers, add https://thejart.com/api/v1/mcp as a custom connector with the header Authorization: Bearer jart_… instead.
Cursor
In ~/.cursor/mcp.json or a project’s .cursor/mcp.json:
{
"mcpServers": {
"jart": {
"url": "https://thejart.com/api/v1/mcp",
"headers": {
"Authorization": "Bearer ${env:JART_API_KEY}"
}
}
}
}VS Code
In .vscode/mcp.json; VS Code asks for the key once and stores it:
{
"inputs": [
{
"type": "promptString",
"id": "jart-key",
"description": "Jart API key",
"password": true
}
],
"servers": {
"jart": {
"type": "http",
"url": "https://thejart.com/api/v1/mcp",
"headers": {
"Authorization": "Bearer ${input:jart-key}"
}
}
}
}ChatGPT
ChatGPT connects to MCP servers that sign in with OAuth or need no sign-in, and Jart’s uses keys, so it does not connect to ChatGPT yet. Sign-in with your Jart account is planned.
Then ask
“Here is ring.glb: what does it weigh in 14k and platinum, and what ring size is it?” · “Is this file ready to cast? My caster wants 0.8 mm walls.” · “Is this the version my client approved on Jart?” · “Send the approved Solitaire for Mia to Bangkok Cast.” · “What will 3.2 g cast at with Bangkok Cast?” · “Is this ring photo verified from CAD? thejart.com/v/…”
Limits
Over a limit, the API answers 429 with Retry-After; a file over the size limits is 413, a format it cannot read 415, and every error says what to change.
| Plans | Pro ($29 a month) and up, and early access |
|---|---|
| Keys | Up to 10 per account, made and revoked in Account settings |
| Calls | 60 a minute per account |
| Measurements | 500 a day per account (facts, cast check, verify; UTC days) |
| Model size | 64 MB and 1,000,000 triangles through the API; about 9 MB through MCP (the file travels base64-encoded) |
| Formats | GLB (Meshopt and quantized meshes are fine; Draco not yet), STL (binary or ASCII), OBJ |
Your files and your data
Files you send are measured in memory and never stored: nothing is saved to your projects and nothing is kept after the answer. Jart keeps your keys’ names and fingerprints and a count of calls per key and day for 90 days, which you can see in Account settings, download with your data and delete with your account (privacy policy). Every figure is an estimate from the file’s mesh: casting adds sprue and loss, alloys vary by a few percent, and carat comes from each stone’s volume. Verify before casting.
See the same numbers in the studio: open a design and press Facts.
Open a 3DM, STL or GLB file, or a sample ring, choose the stone and the metal, and render it photoreal in your browser. No account needed.