Connect InstantTakeoff to Claude, ChatGPT and other MCP clients
InstantTakeoff has an MCP connector. Add it to an assistant that supports remote MCP servers and you can ask it, in plain words, to start a takeoff, check progress, read the counts per fixture type and sheet, and get the estimate or an Excel link.
Server URL: https://app.instanttakeoff.ai/mcp
The connector works on your own InstantTakeoff account. When you connect, you sign in the usual way (email link, Google or Microsoft), choose the company, and approve what the app may do. It acts as you, in that one company, and it uses your seat.
Claude
- Claude (web and desktop): open Settings, then Connectors, and add a custom connector. Paste the server URL above, then choose Connect. A browser page opens: sign in to InstantTakeoff, pick the company and choose Allow.
- Claude Code: run
claude mcp add --transport http instanttakeoff https://app.instanttakeoff.ai/mcp, then run/mcpinside Claude Code and pick instanttakeoff to sign in.
ChatGPT
Where your ChatGPT plan allows custom connectors (developer mode), create a new connector, paste the server URL above and choose OAuth as the authentication. ChatGPT opens the InstantTakeoff sign-in page; sign in, pick the company and choose Allow.
Other MCP clients
Any client that speaks MCP over Streamable HTTP can connect with the server URL. Sign-in is discovered automatically:
- the server answers
401with aWWW-Authenticateheader that points athttps://app.instanttakeoff.ai/.well-known/oauth-protected-resource/mcp; - the authorization server metadata is at
https://app.instanttakeoff.ai/.well-known/oauth-authorization-server; - clients can identify themselves with a Client ID Metadata Document (an https
client_id) or register with Dynamic Client Registration; - the flow is OAuth 2.1 authorization code with PKCE (S256) and the
resourceparameter.
Clients that only take a fixed header can use an API key instead: Authorization: Bearer itk_... (see the API guide to create one).
Protocol versions: 2026-07-28 (stateless requests) and the earlier 2025-11-25, 2025-06-18 and 2025-03-26 revisions (initialize handshake). Responses are JSON. There are no sessions and no standalone event stream.
What it can do
| Tool | What it does | Needs |
|---|---|---|
list_projects | The company's projects, newest first | read |
get_project | One project with its drawing sets, each set's stage and totals | read |
create_project | A new project | write |
upload_drawing | Add a PDF drawing set to a project, from an https link or as base64 chunks | write |
list_pages | Every page of a set: page number, sheet number, title, whether it was picked for the takeoff | read |
start_takeoff | Count chosen pages, or check the whole set for lighting plans | write |
get_job_status | Progress of a job, or of a set's takeoff: reading, finding, counting, ready | read |
get_takeoff_results | Counts per type per sheet: fixtures, exit signs and controls, with schedule descriptions | read |
get_review_status | Where the review pass stands: how many sheets are reviewed, and each sheet's review lines | read |
get_estimate | The priced estimate as in the app's Estimate tab | read |
export_estimate | A private Excel or CSV download link that works for a few minutes | read |
get_model3d_summary | The set's 3D model floor by floor: counts, wall and wiring feet, heights, panels, drops and risers, and a link that opens the 3D view; build builds it when missing or out of date (needs write) | read (write with build) |
get_sheet_boxes | Every symbol box on a sheet: id, position, kind, type, score, whether it counts | read |
find_similar | Every copy of one symbol on a sheet (by box, box id or type); with accept, adds the new ones as a type | read (write to accept) |
retake_sheet | Count a sheet, or every sheet of a set, again with the model; edits are kept unless fresh | write |
search_price_list | Search the company's price list by catalog #, description, manufacturer or vendor | read |
import_price_list | Import a vendor price list given as CSV text: a preview first, then commit to apply (owners and admins) | write |
match_fixture_types | Each estimate line's price list match with suggestions; confirm matches or accept_catalog_matches (remembered for later projects) | read (write to confirm) |
add_vendor_quote | A vendor quote for one fixture type of a project, per unit or for the lot | write |
set_bid_markups | A project's overhead, profit, sales tax and contingency percentages and other costs | write |
get_bid_summary | Quantities by type, material, tax, labor, markups, the bid total and what is not priced yet | read |
create_proposal | A proposal from the company's proposal settings and the bid, with a private PDF or Word link | write |
export_proposal | A private PDF or Word link for an existing proposal | read |
list_assemblies | The company's assemblies (a fixture plus its parts, priced as one unit): parts, material and labor per fixture, what each is used for | read |
apply_assembly | Each fixture type of an estimate with its assembly and parts; assign picks one per type (an id, null for none, or "auto") | read (write to assign) |
Resources: instanttakeoff://projects/{project_id}, instanttakeoff://sets/{set_id}/results and instanttakeoff://sheets/{sheet_id} give the same summaries as JSON.
A typical request: "Create a project called Riverside Clinic, upload this plan set, and tell me the fixture counts by type when it's done." The assistant calls create_project, then upload_drawing with the link, polls get_job_status until the stage is ready, then reads get_takeoff_results.
Then: "Price it from our price list, 10% overhead and 8% profit, and write a proposal to Sample General Contractor." The assistant calls match_fixture_types with accept_catalog_matches, set_bid_markups, get_bid_summary, then create_proposal and hands you the PDF link.
Or: "Use our high bay assembly for type H and show me what it adds." The assistant calls list_assemblies, then apply_assembly with assign: [{type: "H", assembly_id: ...}], and reads back the parts and the new line total.
How the counts are made
After an upload, the set is read, the lighting plans are found, and the model counts every fixture, exit sign and lighting control on them and types each one from its tag against the fixture schedule. The model keeps improving and is checked against a held-out test set. Then a review layer double-checks every sheet: get_review_status shows what it checked, what it is re-examining now and the corrections it applied, and how many sheets are reviewed. Every count is a box you can open and check in the InstantTakeoff app; check anything critical there before you bid.
Permissions and safety
- read: see projects, drawing sets, counts, estimates, the price list, bids and proposals, and make export links.
- write: create projects, upload drawing sets, start takeoffs, add symbols found with
find_similar, take sheets off again, confirm price list matches, pick assemblies for fixture types, add vendor quotes, set markups and create proposals. Changing the company's price list or assemblies needs an owner or admin. You can untick it on the approval page to connect read-only. - The connector never deletes projects or drawing sets and never changes billing, seats or members. Taking a sheet off again saves a version of it first, so it can be restored in the app.
- Free trial companies can change only their free trial project; a view-only company can still read results and export.
- Disconnect an app any time under Team and billing, Connected apps. Its access ends at once. Removing a member from the company also ends their connections and API keys.
- Export links need no sign-in for the few minutes they work, so share them only with people who may see the estimate.
Limits
Requests are rate limited per connection and per company; a client that goes over gets 429 with a Retry-After header. A drawing set can be up to 1 GB. Links for upload_drawing must be https on a public host (signed storage links work).