Mmcp.market

OpenTakeoff MCP server

by Kentucky-ai·io.github.Kentucky-ai/opentakeoff·v0.9.87

Construction takeoff for AI agents: load plans, set scale, measure, count, export with provenance.

A91/100grade A
What users say
No reviews yet
Be the first
Safety scan
A91/100

full report

Adoption
Established

132 stars1.7k downloads/wk

Reviews

Write one

Nobody has reviewed OpenTakeoff yet.

If you have run it, two minutes of your experience saves the next person an afternoon.

OpenTakeoff tools (56, 5 write)

write = sends, deletes, buys or posts

Read from the package source without running it. The installed server may list more.

  • annotate
  • apply_rules
  • count_marks
  • create_rfiwrite action
  • cut_out
  • delete_rfiwrite action

    Withdraw an RFI. A TOMBSTONE, never a renumber: the record stays with its number reserved, so the register and the marked set keep printing a gap where it was and the next RFI takes the next number \u2014 an RFI number that went out and then meant something else would be a lie. Every markup linked to it keeps its note and loses the link (the canvas's own delete rule). Withdraw a question you raise

  • delete_shapewrite action

    Remove a committed shape by the id returned when it was committed. …

  • delete_verdictwrite action

    Lift an agent verdict mark by id (mark_verdict's reply, or list_annotations verdicts[]). Agent marks only: the estimator's APPROVED seal is human ink and is refused \u2014 the same line edit_shape holds on reviewed shapes. Journaled like every mutation, so undo_last re-seats a lifted mark exactly where it was.

  • derive_base
  • derive_transitions
  • detect_rooms
  • duplicate_condition
  • edit_annotation

    Shorten, replace or clear the text of an existing annotation. Get annotation_id from list_annotations (annotations, not verdicts). Changes only text: position, shape, dimension length, condition links, quantities and review records stay unchanged. Empty text clears the note; a dimension still prints its measured length. Refuses an RFI-linked note: review that question's context in the browser RFI

  • edit_condition
  • edit_materials
  • edit_shape
  • export_dxf
  • export_marked_pdf
  • export_report
  • export_takeoff

    The full "opentakeoff.takeoff_canvas.v1" annotations payload \u2014 exactly what the app autosaves, importable by it. Returned inline; pass path to also write it to disk as JSON. …

  • find_schedule

    Locate a schedule table in the set (#87): pass a kind ("room finish", "material"/"finish") and get every matching table's sheet, title, headers, TOTAL row count, and REGION \u2014 sized for a view_sheet look or a read_sheet_text pull of exactly the table. A schedule continued across sheets is ONE match whose "parts" list every fragment (base first) with its own viewable region; tables read through

  • find_text
  • get_sheet_vectors
  • import_takeoff
  • link_annotation

    Attach an existing annotation to a condition, or detach it by passing an empty condition \u2014 the canvas's Attach/Detach control, reachable by an agent. Use it to tie up notes left unattached (list_annotations reports how many), or to move one to the finish it actually concerns. Attaching mints the tag on first use.

  • list_annotations

    Every annotation on the takeoff, with condition_id RESOLVED to its finish tag so you can act on the reply without joining against conditions[]. Filter by sheet, by condition, or both. Coordinates come back in image px (the same frame you passed in), not the normalized form they're stored as. `unattached` counts the notes carrying no condition \u2014 the candidates for link_annotation. `verdicts` i

  • list_rfis

    Every RFI in the register with its status, sheet, who raised it (actor) and whether an agent-raised one is still pending the estimator's acceptance, its linked markup ids, and the finish tags those markups are attached to \u2014 the scopes the question touches. withdrawn[] lists the numbers delete_rfi tombstoned, so a gap in the sequence is explained rather than silent. Read this before raising a

  • list_shapes

    The mid-session shape inventory (#149): every committed shape's id, sheet, condition tag, role, quantities, room label, vertex count, and review state in one compact read \u2014 the ids edit_shape and delete_shape assume you have, without pulling the whole export_takeoff payload to find one shape. Filter by sheet, by condition, or both; filters narrow, an empty list is a result, not an error.

  • load_plan

    Open a plan PDF from disk. Default: replace the whole session (previous documents, scales, conditions, and shapes are cleared). merge: true ADDS the document to the working set instead (#152) \u2014 a bid set is plans + schedule + addenda, not one PDF \u2014 keeping every scale, condition, and shape; sheet keys carry file names so documents never collide, the sheet graph spans the whole set (resol

  • mark_verdict
  • measure_line

    Measure an open polyline (min 2 points, image px): length_lf at the sheet's scale. Requires the scale to be set. Pass condition to commit it as a linear shape (base, transitions, feature strips). A curved run (base along a radius wall, a curved feature strip) takes arc_through: one point on the bow, marked. …

  • measure_polygon

    Measure a closed polygon you supply (min 3 vertices, image px): area_sf and perimeter_lf at the sheet's scale. Requires the scale to be set. Pass condition to commit it; role "deduct" subtracts. A room ring belongs on the innermost wall-face strokes from get_sheet_vectors, crossing each door opening on the wall centerline and wrapping columns and stubs; never on a hatch edge, casework or a door le

  • measure_surface

    Surface Area \u2014 wall SF (#146): trace an OPEN run along the wall in plan view (min 2 points, image px) and the quantity is traced LF \xD7 height. This is how wall tile, wainscot, and wall systems are taken off \u2014 the quantity family …measure_polygon cannot produce. Height lives on the CONDITION (the canvas's H knob): pass height_ft to set it on this call (journals as its own undo step, lik

  • one_click
  • open_tool_stage

    Enable a stage of this server's tools. Tool exposure is staged to match the takeoff workflow: "setup" (orient: load, scale, read the set) is always enabled; "measure" (commit shapes: …), "revise" (edit, annotate, verdict-mark, undo), and "handoff" (summaries, exports, the marked set) start closed and open here on demand. Opening a stage is idempotent and never closes another \u2014 the surface onl

  • place_count

    Count markers \u2014 EA (#146): one point, one each. Thresholds, stair nosings, floor boxes, entrance mats \u2014 the scale-free quantity family. Commits one count shape per point (computed {count: 1}, exactly the canvas's Count tool), NO scale required, and the whole call is ONE undo step…. takeoff_summary reports them as ea; the marked set draws each marker. …

  • propose_condition_edit
  • propose_takeoff
  • read_sheet_text

    The sheet's text with positions \u2014 items [{str, x, y}] in image px plus the joined text. Optionally restrict to a region {x0, y0, x1, y1}. Use it to read title blocks, room labels, finish schedules, and scale notes. …

  • resolve_rfi

    Answer an OPEN RFI: the answer lands as its response, status becomes answered (the register's own state for "response in"), and the response date stamps exactly as the panel's would, plus an ISO timestamp of the resolve. Only an open RFI resolves \u2014 an answered, closed, or void one is refused rather than re-answered or quietly revived (undo_last reverses your own resolve if the answer was wron

  • resolve_tag
  • revise_proposal
  • scope_duplicates
  • scope_merge
  • set_scale

    Set a sheet's scale \u2014 exactly ONE of: label (a standard scale, e.g. '1/4" = 1'-0"'), upp (real feet per image px), calibrate (two points along a known dimension plus its real feet), or use_detected (adopt the drawn scale note read off the sheet). The detected scale is never applied automatically \u2014 setting it is always this explicit call. Changing an existing scale recomputes measurements

  • sheet_context
  • sheet_graph
  • sheet_info

    Sheet detail: dims (px and pt), vector segment count, whether the sheet has vector linework (…), scale status, the detected scale suggestion, and this sheet's committed shape count. …

  • split_condition

    Cut a twin loose from its family: every following material row freezes at its current values and edits to the original stop reaching it. It keeps its finish tag and still groups with its siblings \u2014 only the inheritance ends. Use when two variants have diverged far enough that following one another is wrong. A condition that already owns its materials returns split:false rather than erroring.

  • sweep_schedule_row
  • symbol_sweep
  • takeoff_summary

    Per-condition totals (floor/wall/border SF, LF, EA, SY, with and without waste) plus grand totals \u2014 the Report's numbers, computed by the same rules. Numbers only: the deliverable that SHOWS the work on the drawings is export_marked_pdf. …

  • undo_last
  • view_sheet
  • withdraw_condition_editwrite action

    Drop a pending condition-edit proposal (#365) without touching the condition. undo_last re-seats it.

  • withdraw_proposal

    Take a proposal back (#365): every still-pending shape in the batch is removed in ONE journal step, the record stays marked withdrawn (its label is history the estimator may still read), and new commits stop attaching to it. Shapes the estimator already accepted are ink and stay \u2014 the reply counts them. This is the honest exit for "that batch was wrong" \u2014 one call instead of N delete_sha

Public scan report

scanner v0.1.5 · 2026-09-19 · same rubric, same numbers if you re-run it

no findings
  • Code scan3 source files scanned25/25
  • Live reliabilityno gateway calls yet and no remote to proben/a
  • Tool poisoningtools not inspected (local package is not executed); not countedn/a
  • Auth qualitylocal package, no credentials required12/15
  • Maintenancelast push 0 days ago15/15
  • Maintainer identityregistry namespace matches repository owner7/10
Overall 91/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

Install directly

Runs npx -y opentakeoff-mcp on your machine. Read the scan report first; the gateway never runs local packages.

claude mcp add opentakeoff -- npx -y opentakeoff-mcp
Add to Cursor

OpenTakeoff: common questions

Is OpenTakeoff MCP server safe?
Yes, by our scan: it is graded A (91/100). Read the OpenTakeoff safety report
How do I install OpenTakeoff?
It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
Does OpenTakeoff need an API key?
Not as far as the registry entry and our scan can tell: no credentials are declared or required.
Is OpenTakeoff maintained?
The last commit was in the last day (2026-09-19). The latest release is v0.9.87.

More from Kentucky-ai