add_note
ChatGPTAttach a text note to a group. Plain text; blank lines separate paragraphs.
apply_canvas_ops
ChatGPTApply a batch of annotation operations to a file's canvas atomically, using the same reducer the apps run. The operation set is closed and fully schematized in the ops union — these twelve and nothing else: addStroke / updateStroke / removeStroke (freehand strokes), addShape / updateShape / removeShape (rectangles, ellipses, text, and lines — an arrow is kind 'line' with style.cap 'arrow'; style.cap decorates the end and style.startCap the start, each 'arrow' | 'butt' | 'round' | 'square', and strokes take the same cap/startCap at their top level), addMeasurement / updateMeasurement / removeMeasurement (measurement tiles placed on the canvas), setLayers (replace the layer list), setTileScaleFactor and setTileDocSize (tile sizing). When asked to label a measurement, tile, or measurement annotation, ALWAYS set the measurement's own label with update_measurement (tiles render measurement.label first) — never labelOverride, which is a canvas-only caption that leaves the measurement unlabeled everywhere else; reserve it for an explicitly canvas-specific caption. For paged PDF documents (pdfCanvas files) pass page — each page has its own canvas in PDF-point coordinates (origin top-left; see get_canvas for the page size). The remove* ops and setLayers discard elements permanently.
convert_measurement
ChatGPTParse a measurement string and convert it between units using the exact math BOLDR uses (never compute conversions yourself). Accepts strings like "3' 4-1/2\"", "42.5 in", "130 cm", or a bare number with fromUnit. Results use BOLDR display rounding (the increments REEKON devices show, e.g. mm in 0.5 steps).
create_canvas
ChatGPTCreate a blank annotation canvas (sketch) in a group. Draw on it with apply_canvas_ops. Auto-named "Canvas N" when name is omitted.
create_folder
ChatGPTCreate a job folder in a project (folders don't nest). Assign jobs to it by setting their folderId.
create_formula
ChatGPTCreate a formula (math.js expression over measurement-column variables) in the org library, or in a template (pass templateId).
create_group
ChatGPTCreate a group in a job. 'form' groups are table rows and REQUIRE a sectionId (the section's columns are seeded empty); 'list' groups are standalone measurement lists and take NO sectionId. Group numbering is assigned by the server.
create_groups
ChatGPTCreate up to 50 form-group rows in one section atomically. Cells are keyed by column id; measurement/angle cells take a VALUE (number, measurement string like "3' 4-1/2\"", or {value, label, note}) and the measurement docs are created for you — never pass measurement ids here. Other column types take the same values as set_cell_value. Prefer this over repeated create_group/create_measurement calls.
create_job
ChatGPTCreate a job in a project. The server seeds progress tracking and the Default measurement group automatically.
create_label
ChatGPTCreate a printable label in the org label library, bound to a job (measurement cells resolve there). Max 4 rows × 2 cells. To make a QR cell open a BOLDR entity (e.g. the group/form the label belongs to), pass qrOptions.target — e.g. {type:'group',projectId,jobId,groupId} — instead of value: the server mints the share link the apps would.
create_measurement
ChatGPTRecord a measurement in a group. Length values accept a number in unit or a measurement string like "3' 4-1/2\"" (stored canonically in micrometers); angle values are signed degrees. Pass columnId to fill a form-group cell with the new measurement.
create_project
ChatGPTCreate a project in the organization. The project index (ordering) is assigned by the server.
create_section
ChatGPTCreate a section (a table definition) in a job. tableConfig defines the columns; form groups created from the section become its rows. Column types: text | number | measurement | angle | boolean | singleSelect | multiSelect | formula | conversionTable | instructions.
create_template
ChatGPTCreate a reusable job template (column + tolerance configuration) in the organization library. API-created templates are always org-private.
delete_file
ChatGPTPermanently delete a file and its stored content (binary, thumbnail, annotations). Confirm with the user first.
delete_folder
ChatGPTDelete a job folder. Jobs inside it are NOT deleted — they are moved out (folderId reset to '').
delete_formula
ChatGPTPermanently delete a formula from the org library, or from a template (pass templateId). Confirm with the user first.
delete_group
ChatGPTPermanently delete a group and (via the backend cascade) its measurements and files. The Default group cannot be deleted. Confirm with the user first.
delete_job
ChatGPTPermanently delete a job AND everything under it (groups, measurements, files) via the backend cascade. This cannot be undone — confirm with the user first.
delete_label
ChatGPTPermanently delete an org label (including its preview and cell images). Confirm with the user first.
delete_measurement
ChatGPTPermanently delete a measurement. Any form cell referencing it is cleared to empty. Confirm with the user first.
delete_project
ChatGPTPermanently delete a project AND everything under it (folders, jobs, groups, measurements, files) via the backend cascade. This cannot be undone — confirm with the user first.
delete_section
ChatGPTPermanently delete a section AND all of its groups (their measurements and files cascade). This cannot be undone — confirm with the user first.
delete_template
ChatGPTPermanently delete an org template with its files and formulas. Confirm with the user first.
edit_section_columns
ChatGPTAdd one column to a section's tableConfig (pass addColumn; new cells are seeded empty on every group) or remove one (pass removeColumnId; the column's cells, descriptions and tolerances are deleted from every group — this discards data). Pass exactly one of the two.
evaluate_calculator
ChatGPTRun a calculator's equations against supplied input values and return the computed outputs. Keys of inputs are field ids (see get_calculator). Measurement fields accept a number in the field's unit or a measurement string like "3' 4-1/2\""; angle fields take degrees; select fields take an option string.
export_job_csv
ChatGPTProduce the full CSV export of a job — the same file the BOLDR apps generate — with all cell values, computed formula columns, and measurements formatted in the requested unit.
finalize_upload
ChatGPTStep 2 of a direct upload: after the bytes were PUT to the URL from get_upload_url, validates them and attaches the file to the group or template chosen in step 1 — photos become annotation canvases, PDFs become paged PDF documents, exactly like upload_file.
find_out_of_tolerance
ChatGPTScan every toleranced value in a job and return the ones outside their tolerance bounds, ranked by deviation severity. Deviation is a percentage of the allowed tolerance range (100% = at the bound).
get_calculator
ChatGPTFetch a calculator: its input and output fields (with units and options) and the equations linking them. Use it to learn what inputs evaluate_calculator needs. Set includeDiagram to also see the labeled diagram image.
get_canvas
ChatGPTRead a file's Skia annotation canvas (strokes, shapes, placed measurements, layers) — group files or template files (templateId). Paged PDF documents (pdfCanvas files) keep one canvas per page: pass page (default 0); coordinates are PDF points, origin top-left. Edit with apply_canvas_ops.
get_deviation_trend
ChatGPTHow a job's toleranced measurements have tracked over time: per-day (or per-week) counts, out-of-tolerance counts, and average/worst deviation as a percentage of the allowed range. Useful for 'is accuracy improving?' questions.
get_file
ChatGPTFetch one file (group file, or template file via templateId): notes return their full text; photos and image files return the image inline (thumbnail by default) plus a 15-minute signed URL for the full-resolution original; other binaries (PDF, 3D) return the signed URL only.
get_job_details
ChatGPTOne-call snapshot of a job: metadata, sections (the column schemas), and groups with their filled-in cell values and measurement counts. Cell values are formatted in the requested unit. Formula-column values are computed by the apps and omitted here — use export_job_csv for fully computed rows.
get_job_progress
ChatGPTCompletion statistics for a job: overall progress, per-section cell fill counts, measurement counts, and how many toleranced values are in or out of tolerance.
get_project_progress
ChatGPTRoll up completion across every job in a project: per-job progress (0–1, maintained by the backend) and project-level summary. Cheap — use get_job_progress for a per-section breakdown of one job.
get_template
ChatGPTFetch one template in full (tableConfig with options, tolerances) plus its files and formula count. Resolves org templates first, then the public/shared pool.
get_upload_url
ChatGPTStep 1 of uploading a file whose original bytes are on disk (an attachment in a sandbox, a local file) or too big to inline (up to 25 MB; PNG/JPEG/PDF, SVG also for template files): returns a one-time URL. PUT the raw bytes to it from a shell — curl -X PUT --upload-file <path> "<putUrl>" — then call finalize_upload with the uploadId. The bytes go directly to BOLDR storage without passing through this conversation. The URL expires in 15 minutes and accepts exactly one PUT.
import_calculator
ChatGPTSave a construction calculator from the library into a group as a calculator instance file — the same file the apps' run screen saves. The definition is frozen into the file (it keeps working if the source calculator changes) and the diagram with its thumbnail comes along. Pass inputs to pre-fill input fields (field id → value, parsed exactly like evaluate_calculator); computed outputs are never stored — the apps derive them live, and evaluate_calculator shows them here.
import_table
ChatGPTImport a whole table (e.g. a CSV) in one call: creates a section from column definitions (column ids are generated server-side) and all rows with their measurements. Row cells are keyed by column NAME; measurement/angle cells take values exactly like create_groups. Max 50 rows per call — for more, follow up with create_groups using the returned column ids.
list_calculators
ChatGPTBrowse the construction-calculator library (stair, rafter, volume, conversion calculators and more). source: 'public' = the REEKON-curated library, 'shared' = calculators shared specifically with this organization.
list_files
ChatGPTList files attached to a job's groups — photos and documents (type 'annotation'), notes, sketches ('canvas'), labels — or a template's files (pass templateId instead). Use get_file to read a note or view an image. With projectId+jobId only, sweeps the whole job (capped).
list_folders
ChatGPTList a project's job folders. Jobs reference folders by folderId ('' = not in a folder).
list_formulas
ChatGPTList the organization's formula library, or a template's (pass templateId). Pass formulaId to fetch one formula in full (including variableToColumnMap). Formulas compute derived values from measurement columns.
list_jobs
ChatGPTList the jobs in a project. progress is a 0–1 completion fraction maintained by the backend. Note: nameContains filters within each page — keep paginating while nextPageToken is present.
list_labels
ChatGPTList the org's printable-label library (or the public pool with source 'public'). Pass labelId to fetch one label in full with a 15-minute preview-image URL.
list_measurements
ChatGPTList measurements for one group (paginated) or for the whole job (capped). Values are formatted in the requested unit; length values are stored internally in micrometers (valueRaw), angles in signed degrees. Rows include tolerance status where the group defines tolerances.
list_projects
ChatGPTList the projects in the organization. Note: nameContains filters within each page, so a filtered page may be short — keep paginating while nextPageToken is present.
list_templates
ChatGPTList reusable job templates (column and tolerance configurations). source: 'org' = this organization's private templates, 'public' = the public library, 'shared' = templates other orgs shared with this one.
move_folder
ChatGPTMove a job folder and every job in it to another project (ids preserved, QR share links rewritten, sources deleted after the copy). Cross-project only — same-project folder changes go through update_folder/move_job. Confirm with the user first.
move_job
ChatGPTMove a job to another project or folder. Same-project moves just re-folder; cross-project moves copy the job's entire subtree and files, rewrite its QR share links, then DELETE the source (ids are preserved, so nothing else changes). Confirm with the user before cross-project moves; large jobs can take a minute.
save_group_label
ChatGPTCreate (fileId omitted) or fully replace (fileId given) a printable label saved in a group. rows/rowSizes describe the whole grid — on replace the previous layout is discarded, never merged. Measurement cells bind live to group columns. To make a QR cell open a BOLDR entity in the apps (e.g. this group/form), pass qrOptions.target — e.g. {type:'group',projectId,jobId,groupId} — instead of value: the server mints the share link the apps would print. Never copy another label's internal QR value; it would open the ORIGINAL entity.
search_files
ChatGPTFind files by name across every project, job and group you can view — one call instead of walking the tree. Case-insensitive substring match on the file name. Narrow with projectId (and jobId) on large organizations, or filter by fileType (PDF | image | 3D | document) or doc type (canvas, pdfCanvas, note, label, calculator, layoutGroup). Each match includes the full projectId/jobId/groupId address for get_file or list_files. Template files are not covered — use list_files with templateId.
set_cell_value
ChatGPTFill or clear one cell of a form group. Works for text, number, boolean, single/multi-select (option strings), and conversion-table (row label) columns; pass '' to clear. For measurement/angle columns use create_measurement with columnId instead.
set_column_unit_lock
ChatGPTLock a measurement column to a fixed display/entry unit (the apps' "Lock units"): every value in the column shows in that unit for all users, and bare-number inputs to create_measurement/create_groups for the column are read in it (measurement strings with an explicit unit still win). Pass unit: null to remove the lock.
update_file
ChatGPTRename a file (or set a group's default file).
update_folder
ChatGPTRename or star a job folder.
update_formula
ChatGPTUpdate a formula in the org library, or in a template (pass templateId).
update_group
ChatGPTUpdate a group's name, sortIndex, descriptions, tolerances, diagramFileId, or cell values (columns map; values are validated against the section's column types). The Default group cannot be renamed. For a single cell, set_cell_value is simpler.
update_job
ChatGPTUpdate job fields (name, folderId, description, address, starred, toleranceConfig). Only the fields passed are changed.
update_label
ChatGPTUpdate an org label (rows/rowSizes replace the whole grid together; rebinding projectId/jobId is validated). Public labels are read-only.
update_measurement
ChatGPTUpdate a measurement's value, label, note, or completion flag. Length values accept a number in unit or a measurement string like "3' 4-1/2\"" (stored canonically in micrometers); angle values are signed degrees.
update_project
ChatGPTUpdate project fields (name, description, address parts). Only the fields passed are changed.
update_section
ChatGPTRename a section or replace its tableConfig. Replacing tableConfig backfills new columns as empty cells on every group of the section. To add or remove a single column, prefer edit_section_columns.
update_template
ChatGPTUpdate an org template. tolerances keys must be tableConfig column ids. Public/shared templates are read-only.
upload_file
ChatGPTUpload a small photo or PDF inline (base64, max 4 MB decoded; PNG/JPEG/PDF — SVG also allowed for template files). Uploads create the same file shapes as the apps: photos become annotation canvases (annotate them with apply_canvas_ops), PDFs become paged PDF documents. For larger files (up to 25 MB), or whenever the original bytes live on disk rather than in context, use get_upload_url + finalize_upload instead. The file type is detected from the content itself.
upload_from_url
ChatGPTHave the BOLDR server fetch a file from a public https:// URL (an S3 presigned URL, a public Google Drive share link, a direct image/PDF link) and attach it — photos become annotation canvases, PDFs become paged PDF documents, exactly like upload_file. Max 25 MB; the file type is detected from the bytes. Only allowlisted hosts are fetched — if a host is refused, download the file yourself and use get_upload_url + finalize_upload. Google Drive links work only for files shared "anyone with the link".
add_note
Claudeapply_canvas_ops
Claudeconvert_measurement
Claudecreate_canvas
Claudecreate_folder
Claudecreate_formula
Claudecreate_group
Claudecreate_groups
Claudecreate_job
Claudecreate_label
Claudecreate_measurement
Claudecreate_project
Claudecreate_section
Claudecreate_template
Claudedelete_file
Claudedelete_folder
Claudedelete_formula
Claudedelete_group
Claudedelete_job
Claudedelete_label
Claudedelete_measurement
Claudedelete_project
Claudedelete_section
Claudedelete_template
Claudeedit_section_columns
Claudeevaluate_calculator
Claudeexport_job_csv
Claudefinalize_upload
Claudefind_out_of_tolerance
Claudeget_calculator
Claudeget_canvas
Claudeget_deviation_trend
Claudeget_file
Claudeget_job_details
Claudeget_job_progress
Claudeget_project_progress
Claudeget_template
Claudeget_upload_url
Claudeimport_calculator
Claudeimport_table
Claudelist_calculators
Claudelist_files
Claudelist_folders
Claudelist_formulas
Claudelist_jobs
Claudelist_labels
Claudelist_measurements
Claudelist_projects
Claudelist_templates
Claudemove_folder
Claudemove_job
Claudesave_group_label
Claudesearch_files
Claudeset_cell_value
Claudeset_column_unit_lock
Claudeupdate_file
Claudeupdate_folder
Claudeupdate_formula
Claudeupdate_group
Claudeupdate_job
Claudeupdate_label
Claudeupdate_measurement
Claudeupdate_project
Claudeupdate_section
Claudeupdate_template
Claudeupload_file
Claudeupload_from_url
Claude