Model Context Protocol

Give your AI agent a trade.

The Estimatic MCP server turns your agent into a senior estimator. One config block — Claude, Cursor, ChatGPT, or your in-house bot can scope, price, refine, and push real contractor estimates as tool calls.

Same Bearer auth as REST
Streamable HTTP transport
16 production tools
Multi-org via X-Estimatic-Org

Endpoint

Server URL & transport

Streamable HTTP transport per the MCP spec. Authenticate with the same Bearer key as the REST API. Multi-org partners pass X-Estimatic-Org.

POST/GET/DELETE — JSON-RPC over HTTP
https://api.estimatic.ai/mcp
Every request must include Accept: application/json, text/event-stream. Without it the server returns 406. SDKs handle this automatically.

Same engine

REST or MCP — your call

Every MCP tool maps 1:1 to a REST endpoint at https://api.estimatic.ai/v1. Same auth, same data, same webhooks. Use REST when you control the code path. Use MCP when an LLM does.

See REST reference

Tool catalog

16 tools your agent can call right now.

Each tool's input schema mirrors the REST endpoint of the same name. Full schemas in the API reference.

create_estimate

Generate a fully-priced estimate from a natural-language scope.

inputs: prompt, trade?, project_zip?, file_ids?, options?

list_estimates

List the org's estimates, newest first, with optional filters.

inputs: status?, client_id?, limit?, cursor?

get_estimate

Retrieve a single estimate with all groups, items, and tiers.

inputs: estimate_id

refine_estimate

Apply a natural-language change and re-price.

inputs: estimate_id, message

patch_estimate

Programmatic edits — update qty, add/remove lines, rename groups.

inputs: estimate_id, ops[]

send_estimate

Email or SMS the customer a signable share link.

inputs: estimate_id, channel, to?, message?

duplicate_estimate

Clone an existing estimate as a fresh draft.

inputs: estimate_id, title?, client_id?

push_estimate

Send a finished estimate to a connected CRM or accounting tool.

inputs: estimate_id, integration, target?

archive_estimate

Soft-delete an estimate (restorable for 30 days).

inputs: estimate_id

create_contact

Capture a new lead with source/UTM and scope notes.

inputs: name, email?, phone?, source?, scope_summary?

convert_contact

Promote a contact to a client and optionally generate an estimate.

inputs: contact_id, create_estimate?

create_client

Create a customer record.

inputs: name, email?, phone?, address?

list_clients

Search and list clients.

inputs: q?, limit?, cursor?

list_integrations

List connected CRM/accounting tools available for push.

inputs:

list_pricing_profiles

List pricing profiles (markups, supplier prefs, rounding).

inputs:

upload_file

Upload a plan, photo, LiDAR scan, or report. Returns a file_id.

inputs: file (binary), kind

Setup

Connect in under a minute.

~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "estimatic": {
      "url": "https://api.estimatic.ai/mcp",
      "headers": {
        "Authorization": "Bearer sk_live_..."
      }
    }
  }
}

Try these prompts

Paste into your agent. Watch it work.

Scope a bath remodel

"Use estimatic.create_estimate to draft a master bath gut remodel for ZIP 30303 — 60 sqft, replace tub with curbless tile shower, double vanity, heated floors. Include good/better/best."

Refine, then push

"Use estimatic.refine_estimate on est_01JXYZ to add a city of Atlanta permit line. Then estimatic.push_estimate into ServiceTitan."

Triage a fresh lead

"Use estimatic.create_contact for Marcus Webb (marcus@example.com, source=google_lsa) interested in a kitchen remodel. Then estimatic.convert_contact and generate the estimate."

Troubleshooting

The three things that trip people up.

HTTP 406 from the server

Your client isn't sending Accept: application/json, text/event-stream. The Streamable HTTP spec requires it. Claude Desktop, Cursor, and the official SDKs handle it; raw fetch() calls usually don't.

Tools don't appear in the agent

Make sure the Authorization header is being forwarded. Some clients strip custom headers from MCP servers. Test with our /tools/list raw HTTP example above — if that works, the server is healthy and the issue is in your MCP client config.

Wrong organization in responses

Your key is scoped to a single org by default. If you hold a partner key spanning multiple orgs, set X-Estimatic-Org: org_01HX... on the MCP transport headers — without it, the request is rejected with permission_denied.

Ship an estimating agent this afternoon.

Free to start. Production keys when you're ready.