opentakeoff-mcp 0.9.83 → 0.9.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server-core.js +8 -8
- package/package.json +1 -1
package/dist/server-core.js
CHANGED
|
@@ -14508,7 +14508,7 @@ function registerTools(realServer, session, opts = {}) {
|
|
|
14508
14508
|
outputSchema: proposeTakeoffOutput
|
|
14509
14509
|
}, run("propose_takeoff", (a) => session.proposeTakeoff(a.label, a.rationale)));
|
|
14510
14510
|
server.registerTool("measure_polygon", {
|
|
14511
|
-
description: `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. ${COORDS}`,
|
|
14511
|
+
description: `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 leaf. Check it with view_sheet overlay:true on a tight crop and fix it with edit_shape. ${COORDS}`,
|
|
14512
14512
|
inputSchema: {
|
|
14513
14513
|
sheet: z2.string(),
|
|
14514
14514
|
verts: z2.array(pointSchema).min(3),
|
|
@@ -15055,7 +15055,7 @@ No review gate: the pencil-not-ink rule exists to stop an agent inventing geomet
|
|
|
15055
15055
|
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
15056
15056
|
|
|
15057
15057
|
// src/wiki.generated.ts
|
|
15058
|
-
var WIKI_VERSION = "0.9.
|
|
15058
|
+
var WIKI_VERSION = "0.9.84";
|
|
15059
15059
|
var WIKI_PAGES = [
|
|
15060
15060
|
{
|
|
15061
15061
|
"key": "index",
|
|
@@ -15094,8 +15094,8 @@ var WIKI_PAGES = [
|
|
|
15094
15094
|
"uri": "takeoff://wiki/workflows",
|
|
15095
15095
|
"title": "Workflows",
|
|
15096
15096
|
"source": "docs/wiki/workflows.md",
|
|
15097
|
-
"source_sha256": "
|
|
15098
|
-
"text": "# Workflows\n\n## Human: open, stitch and measure\n\nOpen the plans and check their revision. Press **G** (or choose **Sheets \u2192 Open\ngallery\u2026**) to open the sheet gallery, then select the\n2\u20134 split sheets in left-to-right order and click **Stitch N into one surface**.\nOn the composite, choose **Align**, click a recognizable point near the joint,\nthen click the same drawn point on the other sheet. Check a second recognizable\npoint and the scale before tracing. Align translates a member; it does not\nrotate or resize it. Once shapes exist on a stitch, alignment is locked.\n\nIf the controls seem missing, **Stitch N into one surface** is in the gallery\nfooter and requires 2\u20134 selected sheets; **Align** appears only on an open\nstitched surface. Create a fresh stitch if Align refuses because takeoffs\nalready exist; deleting a stitch also refuses while takeoffs or markups exist.\n\nUse the composite as one measuring surface. Its marked-set page is labeled as\na composite, not an architect-issued sheet. Save the editable project archive\nwhen preserving the composite is required. MCP has no stitch/alignment tool and\nits current import/export path omits stitches: it cannot be used as a lossless\nhandoff for that document. Have an MCP agent measure source sheets individually\nwith explicit scope boundaries instead.\n\nSource: [Human stitching instructions](https://github.com/Kentucky-ai/opentakeoff/blob/main/docs/USER_GUIDE.md#stitching-a-floor-split-at-a-match-line),\n[stitch records](https://github.com/Kentucky-ai/opentakeoff/blob/main/web/src/lib/stitches.ts),\n[compatibility evidence](https://github.com/Kentucky-ai/opentakeoff/blob/main/protocol/COMPATIBILITY.md).\n\n## Agent: source to reviewed handoff\n\n1. `load_plan` \u2192 inspect sheets/revisions \u2192 `set_scale` on each measured sheet.\n Confirm the relevant detail's scale, which may differ from the overall plan.\n2. Read source text and vectors; inspect the matching region with `view_sheet`.\n Use each room's schedule evidence for its finish. Missing/ambiguous evidence\n is a qualification or RFI, not an inferred assignment.\n3. `propose_takeoff` names a batch; it creates no geometry. Measure small batches\n with the appropriate area, run, surface or count tool.\n4. Inspect overlays and actual boundaries, openings, jambs and deductions.\n `edit_shape` corrects pending shapes. Physical base gaps use explicit runs;\n stepped wall faces use separate height bands. See the [geometry workflow](https://github.com/Kentucky-ai/opentakeoff/blob/main/docs/GEOMETRY_WORKFLOW.md).\n5. `takeoff_summary` and `export_report` check quantities and material coverage.\n Shorten notes through `list_annotations` \u2192 `edit_annotation` where permitted.\n6. Export editable takeoff JSON and a marked-set PDF, reopen the JSON against\n the same source, and check the handoff. Leave agent work pending for the\n human's review; exported files and agent verdicts do not create approval.\n\nThe [MCP route map](takeoff://wiki/mcp) gives the next tool at each step. The\n[agent guide](https://github.com/Kentucky-ai/opentakeoff/blob/main/docs/AGENT_GUIDE.md) covers staging and refusal recovery.\n\n## Evidence that another person can review\n\nKeep source/revision identifiers, calibration choices, measured geometry,\nexpected-versus-observed checks and an overlay or marked-set view. Compare\nspatial agreement as well as quantities. Disclose reference-assisted work;\nit is not a blind accuracy benchmark. Public PRs include screenshots, video or\nreproducible stats, using publishable fixtures. Private drawings and pricing stay\noutside the public repository. See the [repository guide](takeoff://wiki/repo-guide).\n"
|
|
15097
|
+
"source_sha256": "75afa0b82f7163038164851e49f9c63c8ed6c7a69eb2dc1e084423ad8424cc4a",
|
|
15098
|
+
"text": "# Workflows\n\n## Human: open, stitch and measure\n\nOpen the plans and check their revision. Press **G** (or choose **Sheets \u2192 Open\ngallery\u2026**) to open the sheet gallery, then select the\n2\u20134 split sheets in left-to-right order and click **Stitch N into one surface**.\nOn the composite, choose **Align**, click a recognizable point near the joint,\nthen click the same drawn point on the other sheet. Check a second recognizable\npoint and the scale before tracing. Align translates a member; it does not\nrotate or resize it. Once shapes exist on a stitch, alignment is locked.\n\nIf the controls seem missing, **Stitch N into one surface** is in the gallery\nfooter and requires 2\u20134 selected sheets; **Align** appears only on an open\nstitched surface. Create a fresh stitch if Align refuses because takeoffs\nalready exist; deleting a stitch also refuses while takeoffs or markups exist.\n\nUse the composite as one measuring surface. Its marked-set page is labeled as\na composite, not an architect-issued sheet. Save the editable project archive\nwhen preserving the composite is required. MCP has no stitch/alignment tool and\nits current import/export path omits stitches: it cannot be used as a lossless\nhandoff for that document. Have an MCP agent measure source sheets individually\nwith explicit scope boundaries instead.\n\nSource: [Human stitching instructions](https://github.com/Kentucky-ai/opentakeoff/blob/main/docs/USER_GUIDE.md#stitching-a-floor-split-at-a-match-line),\n[stitch records](https://github.com/Kentucky-ai/opentakeoff/blob/main/web/src/lib/stitches.ts),\n[compatibility evidence](https://github.com/Kentucky-ai/opentakeoff/blob/main/protocol/COMPATIBILITY.md).\n\n## Agent: source to reviewed handoff\n\n1. `load_plan` \u2192 inspect sheets/revisions \u2192 `set_scale` on each measured sheet.\n Confirm the relevant detail's scale, which may differ from the overall plan.\n2. Read source text and vectors; inspect the matching region with `view_sheet`.\n Use each room's schedule evidence for its finish. Missing/ambiguous evidence\n is a qualification or RFI, not an inferred assignment.\n3. `propose_takeoff` names a batch; it creates no geometry. Measure small batches\n with the appropriate area, run, surface or count tool.\n4. Inspect overlays and actual boundaries, openings, jambs and deductions.\n `edit_shape` corrects pending shapes. Physical base gaps use explicit runs;\n stepped wall faces use separate height bands. See the [geometry workflow](https://github.com/Kentucky-ai/opentakeoff/blob/main/docs/GEOMETRY_WORKFLOW.md).\n\n### Trace a room the way an estimator does\n\nBlind agent runs against reviewed references showed that the ring, not the\ntotal, is what fails. These rules are what the references are drawn to:\n\n1. The boundary is the **innermost interior wall face**. Never the wall\n centerline, never the far face, never under a wall. Casework, counters,\n fixtures, equipment, hatch patterns, dimension strings, text and leaders\n never define the boundary; the finish runs under casework and fixtures.\n2. Corners sit where two adjacent wall-face strokes meet. Read the strokes with\n `get_sheet_vectors` over a tight region and put each vertex on a stroke; do\n not trace a hatch edge or a raster guess.\n3. At every **door or cased opening** the ring follows the face to the jamb,\n turns into the opening, runs across it on the **wall centerline** (midway\n between that wall's two faces, the full wall on a composite wall), and\n returns along the far jamb. Both rooms sharing the door share that segment.\n A door leaf and its swing arc are never part of the boundary; a leaf drawn\n standing open looks like a wall line and is not one.\n4. **Windows** and other non-passable openings do not break the ring.\n5. Columns, chases, pilasters and wall stubs that project into the room are\n traced around; an enclosed cell drawn with wall-weight lines is not floor.\n6. A **finish split** inside one room is two rings sharing the drawn\n transition line exactly, no overlap and no gap. Where two rooms meet with no\n wall, split on the drawn transition line or the partition's centerline.\n7. Take the finish from the schedule row; a plan tag alone is a cross-check.\n8. After each ring, `view_sheet` a tight crop with `overlay: true` at a high\n `px` and look at every corner and notch before the next room; `edit_shape`\n fixes what the crop shows. A full-sheet render cannot audit a ring.\n\nWhen something is genuinely ambiguous, follow the rule most literally, carry it,\nand say so in the shape's label or an annotation. Do not stop.\n5. `takeoff_summary` and `export_report` check quantities and material coverage.\n Shorten notes through `list_annotations` \u2192 `edit_annotation` where permitted.\n6. Export editable takeoff JSON and a marked-set PDF, reopen the JSON against\n the same source, and check the handoff. Leave agent work pending for the\n human's review; exported files and agent verdicts do not create approval.\n\nThe [MCP route map](takeoff://wiki/mcp) gives the next tool at each step. The\n[agent guide](https://github.com/Kentucky-ai/opentakeoff/blob/main/docs/AGENT_GUIDE.md) covers staging and refusal recovery.\n\n## Evidence that another person can review\n\nKeep source/revision identifiers, calibration choices, measured geometry,\nexpected-versus-observed checks and an overlay or marked-set view. Compare\nspatial agreement as well as quantities. Disclose reference-assisted work;\nit is not a blind accuracy benchmark. Public PRs include screenshots, video or\nreproducible stats, using publishable fixtures. Private drawings and pricing stay\noutside the public repository. See the [repository guide](takeoff://wiki/repo-guide).\n"
|
|
15099
15099
|
},
|
|
15100
15100
|
{
|
|
15101
15101
|
"key": "mcp",
|
|
@@ -15110,8 +15110,8 @@ var WIKI_PAGES = [
|
|
|
15110
15110
|
"uri": "takeoff://wiki/domain",
|
|
15111
15111
|
"title": "Takeoff domain knowledge",
|
|
15112
15112
|
"source": "docs/wiki/domain.md",
|
|
15113
|
-
"source_sha256": "
|
|
15114
|
-
"text": "# Takeoff domain knowledge\n\n| Quantity or record | Meaning | Common mistake |\n|---|---|---|\n| Floor SF | Area assigned to a floor finish, net of supported deductions | Adding wall SF to call the result building floor area |\n| Wall SF | Measured run LF \xD7 that shape's height | Applying one elevation width to every wall or treating floor deducts as wall openings |\n| Base/transition LF | Installed run length or a disclosed derived allowance | Treating a numeric opening allowance as a located gap |\n| Count | Located instances with count semantics | Counting a note's bare mention as a drawn device |\n| Order quantity | Net quantity with the condition's stated multiplier/waste rules | Increasing the traced geometry to carry waste |\n| Material coverage | A material row derived from measured finish quantities | Drawing duplicate finish polygons for membrane/protection coverage |\n| Confidence | A signal for prioritizing inspection | Treating it as human approval or an accuracy guarantee |\n| Agent verdict | The agent's own recorded check | Creating or claiming an estimator's approval seal |\n\nUse `measure_surface` bands for stepped faces. `cut_out` removes the full height\nof the particular wall run it clips; a partial-height opening needs bands so\nonly affected heights are clipped. Existing records have no elevation-plane\ncoordinate or vertical band offset. Preserve that limitation rather than\ninventing a new meaning for `deduct`.\n\n`derive_base` retains a whole perimeter and may subtract stated LF numerically.\nExplicit `measure_line` runs and located cuts show installation gaps. Inspect\nopen finish splits, jamb returns and columns; apparent openings need source\nevidence. `derive_transitions` can withhold a wall-separated boundary: a returned\ncandidate is still something to inspect.\n\nMCP work stays pending; correction does not approve it. A human's correction\nfreezes original machine outer vertices, including manual agent traces, but it\ncannot restore previously discarded history. Schema validation, confidence,\nreview, approval, identity and Academy certification remain separate.\n\nSources: [quantity math](https://github.com/Kentucky-ai/opentakeoff/blob/main/web/src/lib/totals.js),\n[Session measurement and derivation](https://github.com/Kentucky-ai/opentakeoff/blob/main/mcp/src/session.ts),\n[provenance](https://github.com/Kentucky-ai/opentakeoff/blob/main/web/src/lib/provenance.js),\n[review semantics](https://github.com/Kentucky-ai/opentakeoff/blob/main/protocol/COMPATIBILITY.md),\n[human glossary](https://github.com/Kentucky-ai/opentakeoff/blob/main/docs/USER_GUIDE.md#18-glossary--what-the-words-mean-here).\n"
|
|
15113
|
+
"source_sha256": "4d6d3d1d4368e6e8e9e3ba5eba8f01ee61d0d093913392508789217e8efa14e0",
|
|
15114
|
+
"text": "# Takeoff domain knowledge\n\n| Quantity or record | Meaning | Common mistake |\n|---|---|---|\n| Floor SF | Area assigned to a floor finish, net of supported deductions | Adding wall SF to call the result building floor area |\n| Room boundary | The innermost interior wall face, with door openings crossed on the wall centerline | Tracing a hatch edge, a door leaf drawn open, or stopping at casework; see [workflows](takeoff://wiki/workflows) |\n| Wall SF | Measured run LF \xD7 that shape's height | Applying one elevation width to every wall or treating floor deducts as wall openings |\n| Base/transition LF | Installed run length or a disclosed derived allowance | Treating a numeric opening allowance as a located gap |\n| Count | Located instances with count semantics | Counting a note's bare mention as a drawn device |\n| Order quantity | Net quantity with the condition's stated multiplier/waste rules | Increasing the traced geometry to carry waste |\n| Material coverage | A material row derived from measured finish quantities | Drawing duplicate finish polygons for membrane/protection coverage |\n| Confidence | A signal for prioritizing inspection | Treating it as human approval or an accuracy guarantee |\n| Agent verdict | The agent's own recorded check | Creating or claiming an estimator's approval seal |\n\nUse `measure_surface` bands for stepped faces. `cut_out` removes the full height\nof the particular wall run it clips; a partial-height opening needs bands so\nonly affected heights are clipped. Existing records have no elevation-plane\ncoordinate or vertical band offset. Preserve that limitation rather than\ninventing a new meaning for `deduct`.\n\n`derive_base` retains a whole perimeter and may subtract stated LF numerically.\nExplicit `measure_line` runs and located cuts show installation gaps. Inspect\nopen finish splits, jamb returns and columns; apparent openings need source\nevidence. `derive_transitions` can withhold a wall-separated boundary: a returned\ncandidate is still something to inspect.\n\nMCP work stays pending; correction does not approve it. A human's correction\nfreezes original machine outer vertices, including manual agent traces, but it\ncannot restore previously discarded history. Schema validation, confidence,\nreview, approval, identity and Academy certification remain separate.\n\nSources: [quantity math](https://github.com/Kentucky-ai/opentakeoff/blob/main/web/src/lib/totals.js),\n[Session measurement and derivation](https://github.com/Kentucky-ai/opentakeoff/blob/main/mcp/src/session.ts),\n[provenance](https://github.com/Kentucky-ai/opentakeoff/blob/main/web/src/lib/provenance.js),\n[review semantics](https://github.com/Kentucky-ai/opentakeoff/blob/main/protocol/COMPATIBILITY.md),\n[human glossary](https://github.com/Kentucky-ai/opentakeoff/blob/main/docs/USER_GUIDE.md#18-glossary--what-the-words-mean-here).\n"
|
|
15115
15115
|
},
|
|
15116
15116
|
{
|
|
15117
15117
|
"key": "repo-guide",
|
|
@@ -15493,7 +15493,7 @@ function nameTheStageInRefusals(server) {
|
|
|
15493
15493
|
// package.json
|
|
15494
15494
|
var package_default = {
|
|
15495
15495
|
name: "opentakeoff-mcp",
|
|
15496
|
-
version: "0.9.
|
|
15496
|
+
version: "0.9.84",
|
|
15497
15497
|
mcpName: "io.github.Kentucky-ai/opentakeoff",
|
|
15498
15498
|
type: "module",
|
|
15499
15499
|
description: "OpenTakeoff MCP server \u2014 drive the takeoff engine from your MCP client over stdio.",
|
|
@@ -15582,7 +15582,7 @@ function buildServer(session = new Session(), opts = {}) {
|
|
|
15582
15582
|
"Knowledge: read takeoff://wiki for the task router, then only the relevant takeoff://wiki/{page}. Pages cover capability limits, architecture, protocol, workflows, MCP routing and domain knowledge; takeoff://wiki/tool-index lists tool stages and required inputs. These resources work before loading a plan and do not change the session.",
|
|
15583
15583
|
"A takeoff's deliverable is the marked-up planset, not a numbers report. Standard finish for ANY takeoff:",
|
|
15584
15584
|
"1. load_plan, then set_scale on each sheet you measure (quantities are px-only until the scale is set).",
|
|
15585
|
-
oneClick ? "2. Commit shapes under finish-tag conditions (one_click / detect_rooms / measure_polygon / measure_line with `condition`; when the set carries a room-finish schedule, prefer detect_rooms assign_from_schedule so each room commits under its OWN row). A COUNT takeoff of value-annotated device marks (GRDs, fixtures, equipment \u2014 the tag-over-value pattern) starts with count_marks {commit: true}: the whole census in one deterministic call, then audit its withheld entries \u2014 reach for the agent-driven per-mark tools only where it refuses or withholds." : "2. Commit shapes under finish-tag conditions (measure_polygon / measure_line with `condition`; a room's polygon is its wall faces \u2014 read
|
|
15585
|
+
oneClick ? "2. Commit shapes under finish-tag conditions (one_click / detect_rooms / measure_polygon / measure_line with `condition`; when the set carries a room-finish schedule, prefer detect_rooms assign_from_schedule so each room commits under its OWN row; a traced ring sits on the INNERMOST wall faces from get_sheet_vectors, crosses doors on the wall centerline, wraps columns and stubs, never follows hatch or a door leaf, and is checked on a tight view_sheet overlay crop before the next room \u2014 takeoff://wiki/workflows has the rule set). A COUNT takeoff of value-annotated device marks (GRDs, fixtures, equipment \u2014 the tag-over-value pattern) starts with count_marks {commit: true}: the whole census in one deterministic call, then audit its withheld entries \u2014 reach for the agent-driven per-mark tools only where it refuses or withholds." : "2. Commit shapes under finish-tag conditions (measure_polygon / measure_line with `condition`; a room's polygon is its INNERMOST wall faces \u2014 read the strokes with get_sheet_vectors over a tight region, put every vertex on a face stroke, cross each door or cased opening on the wall's centerline so both rooms share that segment, run straight past windows, wrap columns, chases and wall stubs, never trace hatch, casework or a door leaf, then view_sheet a tight crop with overlay:true and fix the ring with edit_shape before the next room; take the finish tag from the room's own schedule row via resolve_tag; takeoff://wiki/workflows has the full rule set). A COUNT takeoff of value-annotated device marks (GRDs, fixtures, equipment \u2014 the tag-over-value pattern) starts with count_marks {commit: true}: the whole census in one deterministic call, then audit its withheld entries \u2014 reach for the agent-driven per-mark tools only where it refuses or withholds.",
|
|
15586
15586
|
"3. DERIVE what follows from the rooms instead of re-measuring it: derive_base for base LF (perimeter \u2212 the door openings YOU state), derive_transitions for the line where two finishes meet. Both read committed floor shapes, so they come after step 2. derive_base draws the whole perimeter even where LF is deducted: when the handoff needs actual installed runs, use measure_line on the physical base segments and cut_out for located gaps. Do not clip a derived base that already carries numeric openings. Inspect finish splits, alcoves, jambs and withheld transitions in step 4.",
|
|
15587
15587
|
"4. LOOK at what landed with view_sheet overlay:true and fix misses with edit_shape before trusting totals \u2014 crop the work region tight (full-sheet renders downsample too far to audit a ring).",
|
|
15588
15588
|
"5. Finish by writing the marked-up planset with export_marked_pdf and give the user its file path, alongside export_report for the numbers. Never end a takeoff with numbers alone.",
|
package/package.json
CHANGED