Reckon is the commercial record your coding agent works from. It holds immutable client statements, scope with provenance, deterministic pricing, and the deal state machine — so an agent answering a client question has evidence, not inference.
Reckon is an MCP server. Add it to Claude Code or Cursor in one step. See setup instructions for configuration.
Free tier: the browser — build deals, capture statements, scope, price, approve, and share with your client. No card required.
Solo ($49/mo) or Team ($199/mo): unlocks the MCP tools below. Your coding agent calls Reckon to check scope, explain pricing, and detect change orders.
When you invite your client, they get a link to a deal room where they see every scope item with their own words underneath, the approved price and how it was calculated, and milestone progress. They can ask for something — recorded as a statement, attributable to them, and it changes nothing until you review and price it.
WRITE tools do not commit directly. They return a proposal that a human must explicitly approve before anything changes. An agent cannot alter the commercial record on its own — the record is defensible because a person authorised every change.
No subscription
{ "reason": "SUBSCRIPTION_REQUIRED", "message": "Reckon's MCP tools require an active subscription..." }Deal not found
Deal not found in this workspace.Workspace scoping means a deal in another workspace is invisible, not forbidden.
Stale version
{ "reason": "VERSION_CONFLICT", "message": "Stale deal_version: you sent deal_version=2 but the current value is 5. Re-read the deal..." }Context
The developer is mid-build and the client emailed a new request. They ask their coding agent, which calls Reckon.
What the developer types
“The client just asked for a reporting dashboard. Is that in scope for the HVAC Customer Portal deal?”
What Reckon returns
{
"scope_items": [
{ "label": "Online Scheduling Portal",
"source_statement": { "content": "Customers should be able to schedule appointments online" } },
{ "label": "QuickBooks Integration",
"source_statement": { "content": "We need to sync with QuickBooks so our billing stays accurate" } },
{ "label": "Mobile Dispatch Dashboard",
"source_statement": { "content": "Our technicians need mobile dispatch so they get jobs in real time" } }
],
"pricing": { "approved": true, "quoted_value": { "amount": 25140 } },
"scope_locked": true
}What the agent does with it
The agent compares 'reporting dashboard' against the three scope items and their source statements. None match. It tells the developer this is new scope, not covered, and suggests a change order.
Context
A client questioned the price. The developer needs the hour chain to have a factual conversation.
What the developer types
“The client says $25,140 is too high. Explain how the number was calculated so I can walk them through it.”
What Reckon returns
{
"pricing": {
"base_hours": 192,
"ai_hours": 105.6,
"with_overhead": 135.2,
"risk_multiplier": 1.15,
"rate": { "amount": 200 },
"quoted_value": { "amount": 25140 },
"approved": true
}
}What the agent does with it
The agent writes a plain-language breakdown: 192 conventional hours reduced to 106 with modern tools, 135 with project management and communication overhead, 155 delivered hours including contingency, at $200/hr. Every number traces to a step the client can verify.
Context
The request is confirmed as new scope. The developer asks the agent to prepare a formal change order.
What the developer types
“The client wants to add Stripe payment processing. Prepare a change order against the current approved scope.”
What Reckon returns
{
"change_order_id": "co_a1b2c3",
"status": "DRAFT",
"requires_approval": true,
"deal_version": 5,
"scope_version": 3
}What the agent does with it
A draft change order is created referencing the client's statement, the current pricing version, and the proposed scope addition. The developer reviews it, approves it (two-phase commit requires explicit human approval), and the client sees the updated scope and price in their deal room.
Context
The developer wants to know why the deal is stuck and what action to take.
What the developer types
“What is blocking the Metro Construction deal from advancing?”
What Reckon returns
{
"current_state": "QUALIFIED",
"transitions": [
{ "to": "MEETING_1_READY", "permitted": true }
],
"message": "Ready to advance to: MEETING_1_READY"
}What the agent does with it
The agent sees the deal can advance. If it were blocked (e.g., by an unverified HIGH-impact assumption), the response would name the specific blocker and the developer would know exactly what to resolve.
Context
The developer records a client statement during a meeting. It becomes immutable evidence for future scope decisions.
What the developer types
“In today's meeting the client said: 'We need the system to handle multi-location scheduling, not just single-site.' Capture that as a direct statement.”
What Reckon returns
{
"proposal_id": "prop_x1y2z3",
"requires_approval": true,
"deal_version": 3,
"scope_version": 1
}What the agent does with it
A two-phase proposal is created. The developer reviews the captured statement and approves it. The statement is then immutable — neither the developer nor the client can alter it after the fact.