Docs / Partners
MCP server
Price a building in steel and start it with a Gage fabricator from Claude, ChatGPT or any MCP client. No account needed; partners add their API key.
Gage runs a hosted Model Context Protocol server at:
https://buildwithgage.com/mcp
It is the way into Gage from an AI assistant. Someone designs a house with Claude or ChatGPT, asks what it would cost to build or how to get it built, and the assistant can price the steel frame with the nearest Gage fabricator that can build it, then start a real Gage project for them. No account or key is needed for that.
Partners use the same server with their API key: quotes are then theirs, at their margin, and they reserve and accept through the REST API.
Pricing, fabricator routing and confidence banding all happen in the same engine as API v1. The shop is named by regional alias until it confirms the job, and the build data follows the same rules as the API: see Building with Gage fabricators.
#Who is calling
No key: a member of the public. Quotes are priced under Gage's own public account, at the fabricator's price with no margin, and limited per connection. start_my_project is available, so the person can go ahead.
An API key: a partner. Send the key the REST API issues as a bearer token (Authorization: Bearer gage_test_..., or X-Gage-Api-Key). Quotes are attributed to that key's account, at its margin, and start_my_project is refused: a partner's customer is the partner's, and goes through /quotes/{id}/reserve and /accept. Keys come from your developer dashboard; see Getting started.
initialize and tools/list need no key either way.
#The tools
#quote_my_building
A plain description in, a price out. What an assistant uses when a person describes the building rather than drawing it.
| Field | Required | Notes |
|---|---|---|
project_type | yes | residential, adu or commercial |
total_sqft | yes | Floor area across all storeys |
stories | yes | 1 to 4 |
roof_type | yes | flat, shed, gable, hip or gambrel |
zip | yes | 5-digit US ZIP of the build site |
roof_pitch, ceiling_height_ft, windows, doors | Filled with stated defaults when missing, and listed as assumptions |
It answers with the price (and its likely range), the split into framing steel, engineering and delivery, the fabricator by region and lead time, what was assumed, and the next step. The price is for the steel frame package only, not the foundation, finishes or labour on site, and the answer says so.
#start_my_project
Turns a public quote into a Gage project: the same thing the estimator widget does when a visitor saves an estimate. Gage creates the project with the fabricator that priced it and emails the person a private link to their project page, where they review the quote, message the shop and approve when ready. Nothing is charged.
| Field | Required | Notes |
|---|---|---|
quote_id | yes | From quote_my_building or submit_design_for_quote, made without a key |
name, email | yes | As the person gave them. The link goes to this email only |
phone, project_name | ||
person_agreed | yes | Must be true: the assistant asks the person before sending their details |
The link is never returned in the chat, only emailed. Starting the same quote twice returns the existing project. A partner's quote, or an expired one, is refused. People using Gage this way are under the Terms of Use and the Privacy Policy.
#submit_design_for_quote
Input
| Field | Required | Notes |
|---|---|---|
design.geometry | one of | Inline structured geometry (below). |
design.model_ref | one of | { url, format, sha256? }. Only format: "geometry_json" is machine-readable today. |
project.type | yes | residential, commercial or adu |
project.jurisdiction.zip | yes | 5-digit US ZIP of the build site. Drives fabricator routing and freight. |
project.jurisdiction.code_cycle | e.g. "IRC 2021". Recorded and echoed back. | |
project.load_zone | { snow_psf, wind_mph, seismic }. Omitting these is disclosed as an assumption. | |
project.gauge_spec | 25ga, 20ga, 18ga or 16ga. Omitting it prices 18ga and says so. | |
project.square_footage_sqft, project.stories | Declared values, cross-checked against the geometry. | |
options.include_panelization | Default true. | |
options.max_panel_length_ft, options.stud_spacing_in | Default 12 ft and 24 in on center. |
Geometry is the minimum needed to derive every engine parameter. Coordinates are in units.
{
"units": "ft",
"roof": { "type": "gable", "pitch": "6:12" },
"levels": [{
"index": 0,
"floor_to_ceiling": 9,
"walls": [
{ "id": "W1", "start": [0, 0], "end": [40, 0], "type": "exterior",
"openings": [{ "type": "window", "width": 4, "height": 4, "offset": 20 }] },
{ "id": "W2", "start": [40, 0], "end": [40, 30], "type": "exterior", "openings": [] },
{ "id": "W3", "start": [40, 30], "end": [0, 30], "type": "exterior", "openings": [] },
{ "id": "W4", "start": [0, 30], "end": [0, 0], "type": "exterior", "openings": [] }
]
}]
}
Output is one of three things, and never a guess:
status: "quoted"with a feasibility block, the derived inputs, an itemized quote (steel, transport, engineering, subtotal, range, confidence band, fabricator and lead time), and a download link for the panelization package: panel count, panel footage and the take-off totals. Links expire after seven days.status: "needs_human_review"with the review items, and no price. Curved walls, a header over 12 ft, a cantilevered storey and tall walls all land here.- A structured error (
invalid_geometry,rate_limitedand so on) with aremediationstring the assistant can act on.
With no key, the next steps point at start_my_project; with a key, at the REST accept.
The panel-by-panel schedule is not in the package (panel_schedule is an empty list): it goes to the Gage fabricator that takes the job, with the stamped shop drawings, after the quote is accepted. See Building with Gage fabricators.
#Connecting a client
For a person, the URL is all there is: add https://buildwithgage.com/mcp as a custom connector in Claude or as a connector in ChatGPT, with no authentication. The snippets below are for partners, and put the key where each client expects it; leave the header out to connect as a member of the public. Use a test key while you set up.
#Claude Code
claude mcp add --transport http gage https://buildwithgage.com/mcp \
--header "Authorization: Bearer gage_test_..."
#Claude Desktop
Claude Desktop's custom connectors do not yet send a bearer header, so bridge it with mcp-remote in claude_desktop_config.json:
{
"mcpServers": {
"gage": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://buildwithgage.com/mcp",
"--header", "Authorization: Bearer gage_test_..."]
}
}
}
#Cursor
.cursor/mcp.json in the project, or the global one in ~/.cursor/:
{
"mcpServers": {
"gage": {
"url": "https://buildwithgage.com/mcp",
"headers": { "Authorization": "Bearer gage_test_..." }
}
}
}
#VS Code
.vscode/mcp.json. The input prompt keeps the key out of the file:
{
"inputs": [{ "id": "gage-key", "type": "promptString", "description": "Gage API key", "password": true }],
"servers": {
"gage": {
"type": "http",
"url": "https://buildwithgage.com/mcp",
"headers": { "Authorization": "Bearer ${input:gage-key}" }
}
}
}
#OpenAI Responses API and Agents SDK
{
"tools": [{
"type": "mcp",
"server_label": "gage",
"server_url": "https://buildwithgage.com/mcp",
"headers": { "Authorization": "Bearer gage_test_..." },
"require_approval": "never"
}]
}
The Agents SDK's HostedMCPTool takes the same fields.
#Anything else
Any client that speaks streamable HTTP works: POST JSON-RPC to the URL with Accept: application/json, text/event-stream and the bearer header. The server is stateless, so there is no session to keep and GET returns 405.
#Try it
Once connected, ask the assistant something like:
I'm planning a 1,900 sq ft single-storey house with a gable roof near 84032. What would the steel frame cost, and how do I get it built?
It prices it with quote_my_building, reports the price and the fabricator, and, if you say you want to go ahead, asks for your name and email and starts the project. With exact walls and openings (for example a design the assistant drew), it uses submit_design_for_quote for a tighter price. If it reports needs_human_review or an error, that is the tool refusing to guess, and the right move is to relay it rather than estimate around it.
#Limits
- Leads, quote pages, reservations and accept are REST only; see the API reference.
- Rate limits per key: 20 calls a minute and 500 a day on live keys, 10 and 200 on test keys. Without a key: 6 a minute and 40 a day per connection, and 3 projects an hour per connection and per email address.
- Requests up to about 4 MB. Very large models should go through
design.model_refwith a URL. - A quote can take a few seconds. Clients that time out MCP calls quickly should allow 30 seconds.
#Running it yourself
The server is open in the Gage repository under mcp-server/, with a stdio mode for local agents and the same HTTP mode this endpoint uses. Its README covers both.