# Craft Quantities: construction material calculators (com.craftquantities/engine): tool descriptions scored

- tools/list taken: 2026-11-02 (UTC)
- From: [Official MCP Registry](https://registry.modelcontextprotocol.io/v0/servers/com.craftquantities%2Fengine/versions/latest)
- Connected to: https://api.craftquantities.com/mcp
- Homepage: https://craftquantities.com/api/
- Scoring rules: v2
- Tools: 56
- Average: 63.8 / 100 (Cloudy)
- Near-identical pairs: 10

This page shows how Craft Quantities: construction material calculators (com.craftquantities/engine)'s tool descriptions scored, the issues found and the names of its tools and parameters. The descriptions are the server's own: read them where the copy came from.

Forecall asked the URL this server lists in the official MCP Registry for its tools/list once, on the date above, without calling any tool. The server may have changed since.

## Across the server

- Major: 56 tools. Above 40, models choose less accurately.
- Minor: The server's instructions are 4631 characters. Claude Code reads only the first 2,048 by default (Codex 0.154.0 reads them whole). Put what the server is for first.

## Tools

- `create_supplier_quote_request`: 51 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: items, items[].description, items[].label, items[].name, items[].quantity, items[].unit, items[].order, items[].order.quantity, items[].order.unit, items[].notes, items[].packSize, items[].packs, items[].packName.
  - Minor: String arguments with no constraint or example: items[].order.unit.
- `measure_sketch`: 55 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: shapes[].name, shapes[].points[].x, shapes[].points[].y, shapes[].calculator.slug, shapes[].calculator.figure, reference.dimension, reference.dimension.from.x, reference.dimension.from.y, reference.dimension.to.x, reference.dimension.to.y, reference.dimension.length, reference.width, reference.height, reference.corners[].x, reference.corners[].y.
- `create_project_file_from_drawing`: 56 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: drawing.house.storeys, drawing.house.family, drawing.house.roofFamily, drawing.house.roofSelection, drawing.commands[].op, drawing.commands[].kind, drawing.commands[].selection, drawing.commands[].thickness, drawing.commands[].wastePercent, drawing.commands[].elevation, drawing.commands[].height, drawing.commands[].from.x, drawing.commands[].from.y, drawing.commands[].to.x, drawing.commands[].to.y, drawing.commands[].at.x, drawing.commands[].at.y, drawing.commands[].points, drawing.commands[].points[].x, drawing.commands[].points[].y, drawing.commands[].closed, drawing.shapes[].at.x, drawing.shapes[].at.y, drawing.shapes[].against.shape, drawing.shapes[].against.side, drawing.shapes[].against.offset, drawing.shapes[].doors, drawing.shapes[].doors[].side, drawing.shapes[].windows, drawing.shapes[].windows[].side, drawing.shapes[].legs[].value, drawing.shapes[].legs[].unit, drawing.shapes[].gates[].leg, drawing.shapes[].gates[].offset, drawing.shapes[].gates[].width, drawing.shapes[].finishes, drawing.shapes[].scope, drawing.layout.rooms, drawing.layout.rooms[].at.x, drawing.layout.rooms[].at.y, drawing.layout.rooms[].against.room, drawing.layout.rooms[].against.side, drawing.layout.rooms[].against.offset.
  - Minor: String arguments with no constraint or example: drawing.shapes[].against.shape.
  - Minor: The meaning of the boolean argument drawing.commands[].closed is unclear.
- `create_project_file_from_plan`: 56 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: plan.doors, plan.doors.count, plan.doors.width, plan.doors.height, plan.windows, plan.windows.count, plan.windows.width, plan.windows.height, plan.name, plan.spaces[].doors, plan.spaces[].doors.count, plan.spaces[].doors.width, plan.spaces[].doors.height, plan.spaces[].windows, plan.spaces[].windows.count, plan.spaces[].windows.width, plan.spaces[].windows.height, plan.spaces[].name, plan.roof.
- `estimate_hours`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: takeoffs[].takeoff, drawing.house.storeys, drawing.house.family, drawing.house.roofFamily, drawing.house.roofSelection, drawing.commands[].op, drawing.commands[].kind, drawing.commands[].selection, drawing.commands[].thickness, drawing.commands[].wastePercent, drawing.commands[].elevation, drawing.commands[].height, drawing.commands[].from.x, drawing.commands[].from.y, drawing.commands[].to.x, drawing.commands[].to.y, drawing.commands[].at.x, drawing.commands[].at.y, drawing.commands[].points, drawing.commands[].points[].x, drawing.commands[].points[].y, drawing.commands[].closed, drawing.shapes[].at.x, drawing.shapes[].at.y, drawing.shapes[].against.shape, drawing.shapes[].against.side, drawing.shapes[].against.offset, drawing.shapes[].doors, drawing.shapes[].doors[].side, drawing.shapes[].windows, drawing.shapes[].windows[].side, drawing.shapes[].legs[].value, drawing.shapes[].legs[].unit, drawing.shapes[].gates[].leg, drawing.shapes[].gates[].offset, drawing.shapes[].gates[].width, drawing.shapes[].finishes, drawing.shapes[].scope, drawing.layout.rooms, drawing.layout.rooms[].at.x, drawing.layout.rooms[].at.y, drawing.layout.rooms[].against.room, drawing.layout.rooms[].against.side, drawing.layout.rooms[].against.offset.
  - Minor: String arguments with no constraint or example: drawing.shapes[].against.shape.
  - Minor: The meaning of the boolean argument drawing.commands[].closed is unclear.
- `estimate_house`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: storeys, family, roofFamily, roofSelection.
- `fit_panel`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: rightAngle, rightEnd, measuredAt, label, parts[].label, parts[].width, parts[].count, parts[].bandLong, parts[].bandShort, sheet, sheet.width, sheet.height.
- `import_quote`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: supplier, name.
- `miter_chart`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
- `plan_programme`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: takeoffs[].takeoff, drawing.house.storeys, drawing.house.family, drawing.house.roofFamily, drawing.house.roofSelection, drawing.commands[].op, drawing.commands[].kind, drawing.commands[].selection, drawing.commands[].thickness, drawing.commands[].wastePercent, drawing.commands[].elevation, drawing.commands[].height, drawing.commands[].from.x, drawing.commands[].from.y, drawing.commands[].to.x, drawing.commands[].to.y, drawing.commands[].at.x, drawing.commands[].at.y, drawing.commands[].points, drawing.commands[].points[].x, drawing.commands[].points[].y, drawing.commands[].closed, drawing.shapes[].at.x, drawing.shapes[].at.y, drawing.shapes[].against.shape, drawing.shapes[].against.side, drawing.shapes[].against.offset, drawing.shapes[].doors, drawing.shapes[].doors[].side, drawing.shapes[].windows, drawing.shapes[].windows[].side, drawing.shapes[].legs[].value, drawing.shapes[].legs[].unit, drawing.shapes[].gates[].leg, drawing.shapes[].gates[].offset, drawing.shapes[].gates[].width, drawing.shapes[].finishes, drawing.shapes[].scope, drawing.layout.rooms, drawing.layout.rooms[].at.x, drawing.layout.rooms[].at.y, drawing.layout.rooms[].against.room, drawing.layout.rooms[].against.side, drawing.layout.rooms[].against.offset.
  - Minor: String arguments with no constraint or example: drawing.shapes[].against.shape.
  - Minor: The meaning of the boolean argument drawing.commands[].closed is unclear.
- `write_variation`: 57 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: before.takeoffs[].takeoff, before.drawing.house.storeys, before.drawing.house.family, before.drawing.house.roofFamily, before.drawing.house.roofSelection, before.drawing.commands[].op, before.drawing.commands[].kind, before.drawing.commands[].selection, before.drawing.commands[].thickness, before.drawing.commands[].wastePercent, before.drawing.commands[].elevation, before.drawing.commands[].height, before.drawing.commands[].from.x, before.drawing.commands[].from.y, before.drawing.commands[].to.x, before.drawing.commands[].to.y, before.drawing.commands[].at.x, before.drawing.commands[].at.y, before.drawing.commands[].points, before.drawing.commands[].points[].x, before.drawing.commands[].points[].y, before.drawing.commands[].closed, before.drawing.shapes[].at.x, before.drawing.shapes[].at.y, before.drawing.shapes[].against.shape, before.drawing.shapes[].against.side, before.drawing.shapes[].against.offset, before.drawing.shapes[].doors, before.drawing.shapes[].doors[].side, before.drawing.shapes[].windows, before.drawing.shapes[].windows[].side, before.drawing.shapes[].legs[].value, before.drawing.shapes[].legs[].unit, before.drawing.shapes[].gates[].leg, before.drawing.shapes[].gates[].offset, before.drawing.shapes[].gates[].width, before.drawing.shapes[].finishes, before.drawing.shapes[].scope, before.drawing.layout.rooms, before.drawing.layout.rooms[].at.x, before.drawing.layout.rooms[].at.y, before.drawing.layout.rooms[].against.room, before.drawing.layout.rooms[].against.side, before.drawing.layout.rooms[].against.offset, before.name, after.takeoffs[].takeoff, after.drawing.house.storeys, after.drawing.house.family, after.drawing.house.roofFamily, after.drawing.house.roofSelection, after.drawing.commands[].op, after.drawing.commands[].kind, after.drawing.commands[].selection, after.drawing.commands[].thickness, after.drawing.commands[].wastePercent, after.drawing.commands[].elevation, after.drawing.commands[].height, after.drawing.commands[].from.x, after.drawing.commands[].from.y, after.drawing.commands[].to.x, after.drawing.commands[].to.y, after.drawing.commands[].at.x, after.drawing.commands[].at.y, after.drawing.commands[].points, after.drawing.commands[].points[].x, after.drawing.commands[].points[].y, after.drawing.commands[].closed, after.drawing.shapes[].at.x, after.drawing.shapes[].at.y, after.drawing.shapes[].against.shape, after.drawing.shapes[].against.side, after.drawing.shapes[].against.offset, after.drawing.shapes[].doors, after.drawing.shapes[].doors[].side, after.drawing.shapes[].windows, after.drawing.shapes[].windows[].side, after.drawing.shapes[].legs[].value, after.drawing.shapes[].legs[].unit, after.drawing.shapes[].gates[].leg, after.drawing.shapes[].gates[].offset, after.drawing.shapes[].gates[].width, after.drawing.shapes[].finishes, after.drawing.shapes[].scope, after.drawing.layout.rooms, after.drawing.layout.rooms[].at.x, after.drawing.layout.rooms[].at.y, after.drawing.layout.rooms[].against.room, after.drawing.layout.rooms[].against.side, after.drawing.layout.rooms[].against.offset, after.name, preparedBy, client, paymentTerms.
  - Minor: String arguments with no constraint or example: before.drawing.shapes[].against.shape, after.drawing.shapes[].against.shape.
  - Minor: The meaning of the boolean argument before.drawing.commands[].closed is unclear.
  - Minor: The meaning of the boolean argument after.drawing.commands[].closed is unclear.
- `classify_items`: 58 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: lines[].label, lines[].description, lines[].quantity, lines[].unit, lines[].calculator.
- `optimise_cuts`: 58 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: pieces[].count, pieces[].label, pieces[].band.long, pieces[].band.short, stock[].value, stock[].unit, sheets[].width, sheets[].height.
- `plan_room_trim`: 59 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: walls[].label, walls[].openings, walls[].openings[].kind, corners[].kind, stock[].value, stock[].unit, studs.
- `scribe_template`: 59 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: shape, shape.shape, orientation.
  - Minor: The description mentions none of its 3 or more arguments.
- `convert_units`: 60 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: value, from, to.
- `layout_reinforcement`: 60 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: lengthwise.spacing, widthwise.spacing, chairs.supportEveryNth.
- `create_project_file_from_takeoffs`: 61 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: takeoffs[].takeoff.
- `fit_worktop_run`: 61 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: faces[].length, faces[].label, corners[].kind, corners[].angle, corners[].joint, start, start.end, start.angle, finish, finish.end, finish.angle.
- `get_planner`: 61 / 100
  - Major: Says nothing about when to use it, or when not to.
- `print_template`: 61 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: orientation.
- `trim_corner`: 61 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: corner.kind, customSaw.miterScale.
- `write_proposal`: 61 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: takeoffs[].takeoff, drawing.house.storeys, drawing.house.family, drawing.house.roofFamily, drawing.house.roofSelection, drawing.commands[].op, drawing.commands[].kind, drawing.commands[].selection, drawing.commands[].thickness, drawing.commands[].wastePercent, drawing.commands[].elevation, drawing.commands[].height, drawing.commands[].from.x, drawing.commands[].from.y, drawing.commands[].to.x, drawing.commands[].to.y, drawing.commands[].at.x, drawing.commands[].at.y, drawing.commands[].points, drawing.commands[].points[].x, drawing.commands[].points[].y, drawing.commands[].closed, drawing.shapes[].at.x, drawing.shapes[].at.y, drawing.shapes[].against.shape, drawing.shapes[].against.side, drawing.shapes[].against.offset, drawing.shapes[].doors, drawing.shapes[].doors[].side, drawing.shapes[].windows, drawing.shapes[].windows[].side, drawing.shapes[].legs[].value, drawing.shapes[].legs[].unit, drawing.shapes[].gates[].leg, drawing.shapes[].gates[].offset, drawing.shapes[].gates[].width, drawing.shapes[].finishes, drawing.shapes[].scope, drawing.layout.rooms, drawing.layout.rooms[].at.x, drawing.layout.rooms[].at.y, drawing.layout.rooms[].against.room, drawing.layout.rooms[].against.side, drawing.layout.rooms[].against.offset, reference, preparedBy, client, terms, exclusions, paymentSchedule[].label, paymentSchedule[].percent, includeNotes, showQuantities.
  - Minor: String arguments with no constraint or example: drawing.shapes[].against.shape.
  - Minor: The meaning of the boolean argument drawing.commands[].closed is unclear.
  - Minor: The meaning of the boolean argument includeNotes is unclear.
  - Minor: The meaning of the boolean argument showQuantities is unclear.
- `compare_on_job`: 62 / 100
  - Major: Says nothing about when to use it, or when not to.
- `create_project_file_from_calculations`: 62 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: The description mentions none of its 3 or more arguments.
- `create_project_file_from_house`: 62 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: houses[].storeys, houses[].family, houses[].roofFamily, houses[].roofSelection.
  - Minor: The description mentions none of its 3 or more arguments.
- `make_job_sheet`: 62 / 100
  - Major: Says nothing about when to use it, or when not to.
- `market_documents`: 62 / 100
  - Major: Says nothing about when to use it, or when not to.
- `stair_flight`: 62 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: The description mentions none of its 3 or more arguments.
- `create_drawing`: 63 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: house.storeys, house.family, house.roofFamily, house.roofSelection, commands[].op, commands[].kind, commands[].selection, commands[].thickness, commands[].wastePercent, commands[].elevation, commands[].height, commands[].from.x, commands[].from.y, commands[].to.x, commands[].to.y, commands[].at.x, commands[].at.y, commands[].points, commands[].points[].x, commands[].points[].y, commands[].closed, shapes[].at.x, shapes[].at.y, shapes[].against.shape, shapes[].against.side, shapes[].against.offset, shapes[].doors, shapes[].doors[].side, shapes[].windows, shapes[].windows[].side, shapes[].legs[].value, shapes[].legs[].unit, shapes[].gates[].leg, shapes[].gates[].offset, shapes[].gates[].width, shapes[].finishes, shapes[].scope, layout.rooms, layout.rooms[].at.x, layout.rooms[].at.y, layout.rooms[].against.room, layout.rooms[].against.side, layout.rooms[].against.offset.
  - Minor: String arguments with no constraint or example: shapes[].against.shape.
  - Minor: The meaning of the boolean argument commands[].closed is unclear.
- `export_drawing`: 63 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: house.storeys, house.family, house.roofFamily, house.roofSelection, commands[].op, commands[].kind, commands[].selection, commands[].thickness, commands[].wastePercent, commands[].elevation, commands[].height, commands[].from.x, commands[].from.y, commands[].to.x, commands[].to.y, commands[].at.x, commands[].at.y, commands[].points, commands[].points[].x, commands[].points[].y, commands[].closed, shapes[].at.x, shapes[].at.y, shapes[].against.shape, shapes[].against.side, shapes[].against.offset, shapes[].doors, shapes[].doors[].side, shapes[].windows, shapes[].windows[].side, shapes[].legs[].value, shapes[].legs[].unit, shapes[].gates[].leg, shapes[].gates[].offset, shapes[].gates[].width, shapes[].finishes, shapes[].scope, layout.rooms, layout.rooms[].at.x, layout.rooms[].at.y, layout.rooms[].against.room, layout.rooms[].against.side, layout.rooms[].against.offset.
  - Minor: String arguments with no constraint or example: shapes[].against.shape.
  - Minor: The meaning of the boolean argument commands[].closed is unclear.
- `run_example`: 66 / 100
  - Major: Says nothing about when to use it, or when not to.
- `update_project`: 66 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: operations[].calculator, operations[].value, operations[].name.
- `level_quotes`: 67 / 100
  - Major: Says nothing about when to use it, or when not to.
- `plan_room`: 67 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: doors, doors.count, doors.width, doors.height, windows, windows.count, windows.width, windows.height, name.
- `resolve_id`: 67 / 100
  - Minor: Required identifiers whose description does not say where the value comes from: ref. Name the tool or the place that returns it, or models look it up first.
- `run_example_live`: 67 / 100
  - Major: Says nothing about when to use it, or when not to.
- `run_guide_chain`: 67 / 100
  - Major: Says nothing about when to use it, or when not to.
- `run_takeoff`: 67 / 100
  - Major: Says nothing about when to use it, or when not to.
- `solve_backwards`: 67 / 100
  - Major: Says nothing about when to use it, or when not to.
- `translate_term`: 67 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: The description mentions none of its 3 or more arguments.
- `plan_project`: 68 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: spaces[].doors, spaces[].doors.count, spaces[].doors.width, spaces[].doors.height, spaces[].windows, spaces[].windows.count, spaces[].windows.width, spaces[].windows.height, spaces[].name, roof.
- `calculate_batch`: 69 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: The description mentions none of its 3 or more arguments.
- `fetch`: 69 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Required identifiers whose description does not say where the value comes from: id. Name the tool or the place that returns it, or models look it up first.
- `get_benchmark`: 69 / 100
  - Major: Says nothing about when to use it, or when not to.
- `get_calculator`: 69 / 100
  - Major: Says nothing about when to use it, or when not to.
- `get_example`: 69 / 100
  - Major: Says nothing about when to use it, or when not to.
- `get_sources`: 69 / 100
  - Major: Says nothing about when to use it, or when not to.
- `get_takeoff`: 69 / 100
  - Major: Says nothing about when to use it, or when not to.
- `search`: 69 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: Arguments without a description: limit.
  - Minor: The description mentions none of its 3 or more arguments.
- `calculate`: 74 / 100
  - Major: Says nothing about when to use it, or when not to.
- `check_quote`: 74 / 100
  - Major: Says nothing about when to use it, or when not to.
- `get_illustration`: 74 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Minor: The description mentions none of its 3 or more arguments.
- `make_canvas_link`: 74 / 100
  - Major: Says nothing about when to use it, or when not to.
- `open_in_site_link`: 74 / 100
  - Major: Says nothing about when to use it, or when not to.
- `diagnose_symptom`: 79 / 100
  - Minor: The description mentions none of its 3 or more arguments.

Is your server listed here and you would rather it were not? Email support@forecall.dev, and we will take it off within 7 days.

[All scored servers](https://forecall.dev/en/servers)
