Opentakeoff MCP Server
Open-source (AGPL-3.0) PDF takeoff for construction & flooring — the first engine an AI agent drives natively over MCP, not bolted on. Rooms measured on the wall faces, symbol sweeps, materials + quantities with full provenance, built for preconstruction. Runs entirely in your browser.
Opentakeoff is an open-source mcp server by Kentucky-ai, written mainly in TypeScript, with 734 GitHub stars and the AGPL-3.0 license. Its code was last updated Oct 29, 2026. The latest npm release is opentakeoff-mcp 0.9.105, published Nov 7, 2026, with 2,090 downloads last week.
<a href="https://opentakeoff.kentucky-ai.com"><img src="docs/img/brand/hero.svg" alt="OpenTakeoff: the scan star beside the wordmark, and an agent tracing two rooms of a floor plan on their wall faces" width="100%"></a>
Measure construction plans in your browser, or hand the same engine to your AI agent.<br/> Free, open source and local. Nothing uploads, and nobody has to sign up.
▶ Try it now · 🔌 Plug in your agent · 🛠 Send your first PR
</div>A takeoff is the measuring that every construction bid starts with: how much floor, how much wall, how many fixtures, at what scale and on which sheet. OpenTakeoff is an open-source engine for that job. It has two front ends:
- 🧑🔧 A browser canvas for people. Drag in a plan set, set the scale, trace rooms, and export a report and a marked-up planset.
- 🤖 An MCP server for agents. It offers <!--tool-count-->69<!--/tool-count--> tools over stdio. An agent drives the same engine with the same math and the same scale gate as the canvas, and its work stays a dashed proposal until a person accepts it.
Both front ends share one takeoff format, so you can open an agent's takeoff in the canvas, check it and fix it. Every shape records the scale it was measured at, the method that drew it, and whether a person or an agent drew it.
[!NOTE] One-Click Area is temporarily gated while the flood engine is re-validated on a wider plan corpus. Trace rooms with Area (
A) in the canvas andmeasure_polygonover MCP. Every other tool works as normal. Seedocs/design/ONE_CLICK_GATE.md.
Pick your door
| You are… | Start here | Time | |
|---|---|---|---|
| 🧑🔧 | An estimator with a bid due | Open the canvas, click Guided first takeoff, then read the user manual | 5 min |
| 🤖 | An AI agent, or the person wiring one up | Run npx -y opentakeoff-mcp (see Plug it into your agent), then read the agent manual | 1 min |
| 🛠 | A developer | Read AGENTS.md for the repo map, FEATURES.md for where each feature lives in the code, then Contribute | 10 min |
| 🏗 | A crew that wants its own copy | Fork it. Any static host will run it, and nothing phones home | 5 min |
Plug it into your agent
The server needs Node 20 or newer. You don't need to clone or build anything. Pick your client:
| Client | Install |
|---|---|
| Claude Code | claude mcp add opentakeoff -- npx -y opentakeoff-mcp |
| Codex CLI | codex mcp add opentakeoff -- npx -y opentakeoff-mcp |
| Cursor | |
| VS Code | |
| Claude Desktop | Double-click opentakeoff-mcp.mcpb |
| Docker (from a clone) | docker build -f mcp/Dockerfile -t opentakeoff-mcp . && docker run --rm -i opentakeoff-mcp |
| Any other stdio client | Use the JSON below |
{
"mcpServers": {
"opentakeoff": { "command": "npx", "args": ["-y", "opentakeoff-mcp"] }
}
}
If you've cloned the repo, the root .mcp.json, .cursor/mcp.json
and .vscode/mcp.json register the server when you open the folder, so
there's nothing else to set up.
Your first prompt. Paste this once the server is connected:
Load
demo/sample-finish-plan.pdffrom the OpenTakeoff repo, read the scale note on the floor plan, set the scale, trace room 134 on its wall faces under its finish tag from the schedule, check your ring withview_sheet, and export the marked-up PDF.
The step-by-step walkthrough for each client is in Connect OpenTakeoff to your AI.
The server can also describe itself: read the takeoff://wiki resource before you load a plan.
| Stage | Tools |
|---|---|
| Open and orient | load_plan · sheet_info · sheet_context · get_sheet_vectors · read_sheet_text · find_text · view_sheet |
| Scale | set_scale |
| Measure | measure_polygon · cut_out · measure_line · measure_surface · place_count · count_marks |
| Repeat and derive | symbol_sweep · sweep_schedule_row · derive_base · derive_transitions · apply_rules |
| Read the drawing set | sheet_graph · resolve_tag · find_schedule |
| Edit and audit | list_shapes · edit_shape · edit_condition · edit_materials · duplicate_condition · split_condition · delete_shape · undo_last · scope_duplicates · scope_merge |
| Propose for review | propose_takeoff · revise_proposal · withdraw_proposal · propose_condition_edit · withdraw_condition_edit |
| Mark and sign | annotate · list_annotations · edit_annotation · link_annotation · mark_verdict · delete_verdict |
| Ask the architect | create_rfi · list_rfis · resolve_rfi · delete_rfi |
| Price | set_pricing · set_estimate_settings · estimate_summary · export_estimate · export_proposal |
| Hand off | takeoff_summary · export_takeoff · export_report · export_marked_pdf · export_dxf · import_takeoff |
The generated reference, with the required arguments for each tool, is docs/MCP_TOOL_INDEX.md.
The full tool reference is mcp/README.md.
How a takeoff runs
<img src="docs/img/brand/how-it-works.svg" alt="Open the plan, set the scale, trace rooms on the wall faces, derive base and transitions, deliver a marked-up planset PDF" width="100%"> <img src="docs/img/mcp-live-demo.gif" alt="A real run at 3× speed: an AI agent in a terminal takes off three patient rooms on a VA medical center finish plan over MCP. Each export lands in the web app as dashed pencil proposals, and the operator accepts them, 743.64 SF in all." width="100%"/>A real run at 3× speed. The agent takes off patient rooms 161–163 on a federal finish plan and exports after each commit. Each shape lands in the canvas as a dashed proposal and becomes ink only when the operator clicks Accept. Watch it live and uncut: autonomous agent run (2:47) · finish plan to report in about a minute (1:14) · canvas walkthrough (1:10)
The rules that make it safe to hand to a model
- Scale is a gate, not a default. The engine reads the scale note but never applies it on its own. Measuring an unscaled sheet is refused.
- The ring sits on the wall faces. Rooms are traced on the innermost wall-face strokes. Doors are crossed on the wall centerline, and the agent checks each ring on a rendered overlay before it moves on.
- Agent work stays pencil until a person inks it. An agent can sign its own work with
an
AGENTdiamond. Only a person at the canvas can apply the greenAPPROVEDseal. - Withheld is an answer. When a sweep or a derivation can't be sure, it says why and hands back coordinates. It doesn't return a plausible number.
- The deliverable is a marked-up planset, not JSON.
export_marked_pdfburns the work into the drawings behind a legend cover with totals.
The full contract, with the reasoning behind each rule, is in the tour.
What's new
October 2026
- ✨ The scan star. OpenTakeoff has a new mark for its AI. The star ripples while the agent works and shows up in the Work panel, the Agent tab and the watermark on exported PDFs (#571, #576).
- 💲 Estimate and proposal. You can now price a takeoff by hand (unit, material and labor,
tax, overhead and profit), export it to Excel and download a letter-size bid proposal PDF.
Agents get the same features through five new verbs:
set_pricing,set_estimate_settings,estimate_summary,export_estimateandexport_proposal. Prices always come from the estimator, and nothing fills one in for you (#558–#562, MCP 0.9.99). - 🪟 Reference split-screen. You can now keep a read-only second sheet open beside the one you're tracing (#570, by @knmurphy).
- 🗂 Sheets as a tree. Multi-page PDFs show up as folders, and each row is labeled with the sheet number from its title block (#523).
- ⚡ A faster room engine. Exact grid indexes replace quadratic scans. On a 24-sheet
replay, all 548 room probes came back identical, and
buildNettime dropped by 2.4× to 2.5× on the slowest sheets (#540, #547, #550). - 🔐 Security refresh. The MCP SDK and Zod 4 were upgraded without changing the tool set or the takeoff payloads (#566, MCP 0.9.100).
September 2026: on-device OCR for scanned sheets, plan-set text search, Copy text, schedule import from raster pages, the annotation toolbar, Pin references and a guided first takeoff. Everything is in the CHANGELOG, and the older highlights are in the tour.
What's in the box
| Area | What you get |
|---|---|
| Ingest | PDFs, images and whole .zip plan sets, unpacked in the browser, with up to 4 sheets side by side |
| Scale | Detects the drawn scale note, calibrates from a known dimension, and grades a dimension check, all per sheet |
| Measure | Area, Rectangle, Linear, Curved Line, Surface Area (walls), Count, Cut Out, ⟂ Transitions and Zone check, in imperial or metric |
| Conditions | A color and CAD hatch for each finish, waste %, ×N multiplier, height, thickness, and import from the finish schedule |
| Materials | Coverage rate × basis gives rounded order quantities. Includes a grout calculator and the figured seam LF |
| Roll goods | Lanes, seams, multi-roll splits and to-scale cuts with drag-to-reorder nesting |
| Multi-sheet | A sheet tree with title-block numbers, a gallery, levels, stitching across a match line, PDF layer roles and a reference split |
| Estimate | Unit prices, tax, overhead and profit, an Excel export and a bid proposal PDF |
| Report and export | SF, SY, LF and EA per condition, with and without waste. Exports CSV, JSON, Excel, DXF and a Marked Set PDF |
| Review | Revisions with quantity deltas, markups, approval seals, an RFI register, and agent proposals you accept or reject |
| MCP server | <!--tool-count-->69<!--/tool-count--> tools, sheet resources, a packaged wiki and multi-document sessions (mcp/) |
| Privacy | Runs only in the client. Work is stored in IndexedDB and localStorage and is never uploaded |
You'll find every feature in depth in the tour, every feature mapped to its code in FEATURES.md, and every click in the user manual.
Contribute
OpenTakeoff merges evidence, not promises. It is used on real commercial bids, so a pull request has to show that it works. It doesn't need to be big. People and agents are held to the same bar, and a PR that clears it merges fast.
1 · Find something. Pick an open issue,
an RFC, a
flagship challenge, a
good first issue,
or a bug you hit on your own plans. Bid a trade we don't serve yet? Tell us how you take it off
with the Trade suite form;
no code needed. If it's still an idea, start in
Discussions.
2 · Build it.
git clone https://github.com/<you>/opentakeoff && cd opentakeoff/web
npm ci && npm run dev # http://localhost:5173
npm run check # the exact CI gate
3 · Prove it.
| Your change | The evidence it carries |
|---|---|
| Visible (a panel, a tool, an export) | A screenshot of each surface you changed, and a short recording for a flow |
| Engine (geometry, totals, MCP, readers) | An exact-output gate, a before/after table with its conditions, and the command that reproduces it |
| Any PR | Notes for the reviewer: coordinate spaces, limits you chose on purpose, and anything you didn't verify |
Two merged PRs show the bar well. #346 covers a UI feature with a screenshot of each surface, a recording and the reviewer's notes. #547 covers an engine change with 548/548 identical room probes and a before/after retime table. Both come from @knmurphy. The PR template walks you through the same structure, and CONTRIBUTING.md has the ground rules, including the one-comment contributor agreement.
🤖 Agents are welcome contributors. Point yours at AGENTS.md. PRs from forks
run the full CI with a read-only token, and an agent's PR merges under the same evidence bar
as anyone else's. Engine work that lands ships to every agent that pulls opentakeoff-mcp.
<a href="https://github.com/Kentucky-ai/opentakeoff/graphs/contributors"><img src="https://contrib.rocks/image?repo=Kentucky-ai/opentakeoff" alt="OpenTakeoff contributors"/></a>
Fork it
OpenTakeoff is AGPL-3.0. You can fork it, change it, and ship it to your own crew or as the base of your own product. If you run a modified copy for other people, including as a hosted service, publish your changes under the same license.
- Fork on GitHub, then clone your fork.
- Run it:
cd web && npm ci && npm run dev.npm run checkis the exact CI gate (typecheck, lint, test and build). - Put it on your own URL. The repo includes a
netlify.toml, so importing your fork into Netlify deploys it with no settings. Any static host works, anddocs/SELF_HOSTING.mdcovers the one nginx gotcha.
The geometry libraries have no React or DOM code, so you can lift them straight out:
oneclick.ts (flood fill, face extraction, corner snap),
sheets.ts (scale, polygon area), totals.js
(waste, SY, order quantities) and rollgoods.js (lanes and seams).
The data layer — why this engine exists
Every finished takeoff is a set of expert decisions: this region gets this finish, at this waste. If you record those decisions, you get a labeled dataset (plan geometry paired with the finish an expert assigned to it) that doesn't exist today. The thesis, stated so it can be attacked, is that markup is label.
OpenTakeoff is the instrument that produces that corpus. Collection is opt-in and auditable.
The Contribute button builds a payload that contains only derived data. It never includes
the PDF, file names, client names or scale values, and a whitelist in
contribute.js enforces that. The contract is
docs/CONTRIBUTION_SPEC.md, and the bundled
capture server banks the rows on your own machine. If you don't run it,
nothing is captured. The engine is free because a corpus is only as good as the number of real
takeoffs that flow through it. The research program behind this, including the model work and
the evaluation method, is in the tour.
Contribute is not connected to anything today. The hosted app is built with no contribution
endpoint, so the button cannot send, and its dialog says so before you can press it. Your plans
are not part of a contribution in any build. If an endpoint is connected later, contributions
that are good enough become training data and small models (computer vision and other neural
networks for reading plans), and those are released back as open source with open weights, for
the community to use. Kentucky AI provides the compute and the training cookbooks. The open
model problems are listed under the
research label.
OpenTakeoff Academy scores agents on operating this engine
against geometry they don't control.
Star history
<a href="https://star-history.com/#Kentucky-ai/opentakeoff&Date"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Kentucky-ai/opentakeoff&type=Date&theme=dark" /> <img alt="OpenTakeoff star history" src="https://api.star-history.com/svg?repos=Kentucky-ai/opentakeoff&type=Date" width="600" /> </picture> </a>If OpenTakeoff saved you an afternoon, a ⭐ helps the next estimator find it.
Who's building this
I run estimating for a commercial flooring company, and the takeoff tool I bid with is one I wrote. OpenTakeoff is the open half of that work: a measuring engine for anyone, person or agent, who needs to read a building. The models trained on our own estimating archive stay ours, and the boundary is drawn in public so it can be held to account.
— Michael · Kentucky AI
<a href="https://www.nvidia.com/en-us/startups/"><img src="docs/img/brand/nvidia-inception-program-badge.svg" alt="NVIDIA Inception Program member badge" height="40"></a>
Kentucky AI is a member of the NVIDIA Inception program.
Contact: for research collaborations, data questions, press, or anything that isn't a bug, write to research@kentucky-ai.com. Bugs and feature requests go in issues. Security reports follow SECURITY.md, through private vulnerability reporting.
Contributor credit
Thanks to @knmurphy (Kevin Murphy) for the reference split-screen, the room-engine speedups, the sheet tree, image captures, drawing styles and sharper overlays. The Pin reference tool builds on his image-capture work. The roll-goods layout engine was contributed by Michael Hartman.
License
GNU Affero General Public License v3.0 (AGPL-3.0-only). You can use it,
fork it, ship it and build on it, as long as you share your changes when you run a
modified copy for others. Through commit 84c7f48e (tag apache-2.0-final) OpenTakeoff was
Apache-2.0, and that code stays Apache-2.0 for everyone who already has it. See NOTICE
for attribution, the relicensing note and the section 7(b) attribution term. Contributions are
accepted under the CLA. For commercial terms outside the AGPL, contact
Kentucky AI.
Privacy Policy · Terms of Service · Shared wiki for people and agents
<sub>© 2026 NVIDIA, the NVIDIA logo, and NVIDIA Inception are trademarks and/or registered trademarks of NVIDIA Corporation in the U.S. and other countries.</sub>
Opentakeoff alternatives
View more →Similar mcp servers in Finance & Trading, ranked by GitHub stars. Compare licence, recent activity and scan status before you choose.
| Name | Stars | Licence | Last updated | Scan |
|---|---|---|---|---|
| Opentakeoff (this page) Kentucky-ai | 734 | AGPL-3.0 | Oct 29, 2026 | Scanned, no flagged issues |
| QuantDinger OpenByteInc | 13k | Apache-2.0 | Nov 1, 2026 | Scanned, no flagged issues |
| FinanceToolkit JerBouma | 5.5k | MIT | Nov 1, 2026 | Scanned, no flagged issues |
| Tradingview MCP atilaahmettaner | 5.2k | MIT | Oct 29, 2026 | Scanned, no flagged issues |
| Aktools akfamily | 1.5k | MIT | Nov 1, 2026 | Scanned, no flagged issues |
| Tradememory Protocol mnemox-ai | 1.4k | MIT | Oct 23, 2026 | Scanned, no flagged issues |