Measures construction plans over MCP, calculates quantities, preserves provenance, and exports reports and marked-up PDFs.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent โ or use 1-click editor setup below.
This server is confirmed live โ we successfully called its tools/list endpoint directly (see the verified badge above). We haven't yet sandbox-tested the stdio install command below specifically, which is a separate, ongoing check.
๐ก Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Inspect callable tools, capabilities, and parameters exposed to AI agents by Opentakeoff.
load_planOpen 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) โ a bid set is plans + schedule + addenda, not one PDF โ keeping every scale, condition, and shape; sheet keys carry file names so documents never collide, the sheet graph spans the whole set (resolve_tag can chain a plan tag on one file to a schedule row in another), and the marked set covers every worked sheet. Re-loading an already-merged file is refused โ reload = replace, deliberately. Returns file, files, page_count, and one entry per sheet. The loaded sheets also become browsable resources (takeoff://sheets). Coordinates are image px at render scale 2.0: PDF pt ร 2, origin top-left, y down (the browser canvas's native space). Sheet payloads carry dims in both px and pt.
sheet_infoSheet detail: dims (px and pt), vector segment count, whether the sheet has vector linework (one_click floods it when present; a scanned sheet falls back to rendered pixels, disclosed as raster_traced), scale status, the detected scale suggestion, and this sheet's committed shape count. Coordinates are image px at render scale 2.0: PDF pt ร 2, origin top-left, y down (the browser canvas's native space). Sheet payloads carry dims in both px and pt.
set_scaleSet a sheet's scale โ 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 โ setting it is always this explicit call. Coordinates are image px at render scale 2.0: PDF pt ร 2, origin top-left, y down (the browser canvas's native space). Sheet payloads carry dims in both px and pt.
one_clickOne-Click Area: click inside a room (image px) and the plan's vector linework bounds it โ the sealed flood engine (RFC #60), contour trace, vertices snapped to true PDF endpoints. The engine's arguments are FEET-TRUE through the sheet's scale, exactly the canvas's: gap sealing bridges up to a door-width opening (disclosed as gap_sealed_px โ that much boundary is synthetic), door-swing wedges annex the swing a doorway sweeps (door_wedges), and the minimum-passage rule keeps sub-half-foot slits from conjoining two rooms (min_pass_px/min_pass_delta). Every trace carries the engine's own account of itself: confidence (0..1, with confidence_factors naming what deducted) โ a review PRIORITIZER, never a verification. 1.0 means every signal ran clean, not that the trace is right; a LOW confidence is a view_sheet {overlay: true} audit prompt, not a fact to bid from โ put eyes on the flagged edge before the total means anything. SCANNED sheets work too (#154): where vectors can't bound the room (an image-only scan, or a scan wrapper whose only linework is the title block), the flood falls back automatically to the sheet's rendered pixels โ same engine the canvas uses โ and the reply plus the committed shape's origin carry raster_traced: true so a pixel-bounded ring is never mistaken for a vector-snapped one. Vector always wins where it works; a raster ring's corners are unsnapped, so audit it with view_sheet {overlay: true} before trusting the total. With the sheet's scale set, returns area_sf / perimeter_lf; pass condition (a finish tag, e.g. "CPT-1") to commit the traced shape to the takeoff โ the full engine account rides the committed shape's origin, so the export tells the truth about how each shape was made. Without a scale it returns px-only quantities with a warning and commits nothing (the engine also degrades to its scale-blind fallbacks โ a weaker measurement, one more reason set_scale comes first). role "deduct" makes the committed shape subtract. After committing, LOOK at what landed โ view_sheet {overlay: true} โ and fix an overshot ring with edit_shape before trusting any total. Coordinates are image px at render scale 2.0: PDF pt ร 2, origin top-left, y down (the browser canvas's native space). Sheet payloads carry dims in both px and pt.
detect_roomsBatch room detection: reads every room-number label off the sheet's text layer (e.g. "134", "OFFICE 101") and runs One-Click at each โ one call instead of read_sheet_text + reasoning + N one_click calls. An OCR'd scan (text layer, no vector linework) floods the rendered pixels instead (#154), disclosed per room and on origin as raster_traced. A seed is only reported as a room once it survives three gates, and everything skipped is counted and reasoned in `withheld` โ never dropped silently, because a room the tool tells you it skipped is a question you can ask, while one it hides is a hole in a bid. The gates: a flood that leaked or landed in dense linework never becomes a region; two labels flooding the SAME region commit once (the extra labels ride on `merged_labels` โ double-counting an area is the worst failure an estimating tool has); and a flood that is enclosed and clean but smaller than min_area_sf is a room-number bubble, a door swing, or a wall cavity rather than a room. Every room floods through the SAME sealed engine a single one_click runs (RFC #60 โ feet-true gap sealing, door-swing wedges, the minimum-passage rule), so a batch detection and a click at the same seed measure the same square footage; each room carries the engine's account of its own trace (confidence + confidence_factors, gap_sealed_px, door_wedges, min_pass_px/min_pass_delta), and the same account rides origin on everything committed. Confidence is a review prioritizer, never a verification โ a low-confidence room is a view_sheet {overlay: true} audit prompt, not a fact to bid from. With the sheet's scale set, returns area_sf/perimeter_lf per room. Every committed room carries the room number it was traced from as the shape's `label`, so a sweep arrives already sliced by room โ that field is what the Report's per-room grouping and the workbook's floor ร room tab read, and it is the one thing about a batch that cannot be recovered downstream if it is dropped. TO COMMIT, choose the honest source of the finish tag: assign_from_schedule: true routes every room through its OWN room-finish schedule row and commits each under the FLOOR finish that row states โ when a schedule exists in the set, THIS is the default move, because one agent-chosen tag across N rooms flattens real finish variety into a wrong bid; condition commits every room under that one stated tag (only right when the rooms genuinely share it; role "deduct" makes them subtract). Without a scale, returns px-only quantities per room and commits nothing โ the plausibility floor needs real units, so it only applies once a scale is set. A batch commit is NOT finished until you have LOOKED at it: view_sheet {overlay: true}, audit every ring against the walls, fix misses with edit_shape / delete_shape โ before the totals mean anything. Coordinates are image px at render scale 2.0: PDF pt ร 2, origin top-left, y down (the browser canvas's native space). Sheet payloads carry dims in both px and pt.
measure_polygonMeasure 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. Coordinates are image px at render scale 2.0: PDF pt ร 2, origin top-left, y down (the browser canvas's native space). Sheet payloads carry dims in both px and pt.
Kentucky-ai/opentakeoff MCP server turns construction-plan PDFs into an editable takeoff session. An agent can load a single plan or merge a bid set containing plans, schedules, addenda, legends, and other sheets. The server exposes sheet dimensions, vector linework, text, detected scale suggestions, sheet roles, room tags, schedule rows, and cross-sheet references so the agent can decide what to measure.
Measurements are stored as committed shapes associated with finish or condition tags. Supported quantity families include floor area, linear measurements, wall surface area, and count markers. The server also supports room detection, symbol and schedule sweeps, real holes cut from floor areas, wall-base derivation, finish transitions, materials rows, waste and multiplier settings, and condition inheritance. Each shape retains measurement method, scale, source, review state, and other provenance needed to interpret the result.
The normal workflow is to load a plan, inspect its sheets, and set each sheet's scale explicitly. Scale can come from a standard drawing label, feet per image pixel, two-point calibration, or the detected scale note. The detected value is only a suggestion; it is not applied implicitly.
Geometry uses image pixels at render scale 2.0, with the origin at the top left. Vector-backed sheets use linework for room flooding and endpoint snapping. Scanned or image-only sheets can fall back to rendered pixels, and the result identifies itself as raster-traced. One-click and batch room operations return confidence information and disclose gap sealing, door-swing handling, and other engine decisions. Confidence prioritizes review; it does not verify a boundary.
The Kentucky-ai/opentakeoff MCP server is designed around reviewable output. After batch operations, an agent should inspect an overlay, correct or remove shapes as needed, and only then rely on totals. Wall-separated transition candidates and uncertain symbol matches are withheld as review questions instead of being silently committed.
Run the server locally with:
It communicates over stdio and reads plan PDFs from paths supplied to the tools. The package does not require an API key or hosted service. One-click room tools are subject to the repository's feature gate; the server build can enable them with OPENTAKEOFF_ONE_CLICK=1. Without those tools, room areas can still be measured with supplied polygons, subject to the sheet scale.
The browser canvas is a separate client-only interface, but it shares the measurement engine and document concepts with the MCP server. This listing concerns the stdio server, not the optional capture server or other repository components.
Kentucky-ai/opentakeoff MCP server includes tools for:
Exports distinguish the raw canvas payload from the computed report. The report includes quantities, waste and multiplier results, material purchase calculations, sheet subtotals, scale provenance, and annotations. The marked PDF provides the drawing evidence: legends, colored or hatched shapes, quantity labels, annotations, and approval marks. Machine-generated shapes remain identifiable as unreviewed until reviewed through the supported workflow.
Factual signals from GitHub, npm, and our automated checks โ not a rating.
No reviews yet โ be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/kentucky-ai-opentakeoff)<a href="https://allmcps.com/mcp/kentucky-ai-opentakeoff"><img src="https://allmcps.com/api/badge/kentucky-ai-opentakeoff?style=directory" alt="Opentakeoff on AllMCPs" /></a>