{
  "openapi": "3.0.3",
  "info": {
    "title": "Salterwick Property — MCP tools API",
    "description": "A lettings-and-sales agency demo showing a website assistant that answers from the agency's own published fee list and service catalogue, captures an enquiry as a structured record through an in-chat form card rather than asking for one field at a time, exposes its data over its own MCP server, registers its page actions over WebMCP, and reads back a signed-in landlord's own enquiries through the identity hand-off.",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://hubspot.demo.busymate.ai"
    }
  ],
  "paths": {
    "/mcp": {
      "post": {
        "operationId": "mcpJsonRpcCall",
        "summary": "Invoke this demo's MCP tools over JSON-RPC 2.0",
        "description": "Every tool below is called the same way: POST a JSON-RPC 2.0 envelope with `method: \"tools/call\"` and `params: {name, arguments}`, where `name` is one of list_services, list_plans, search_knowledge, get_enquiry, my_enquiries, request_callback, highlight_service, open_desk_form and `arguments` matches that tool's `<name>Args` schema under `components.schemas`. `method: \"tools/list\"` returns the live catalogue; `method: \"initialize\"` starts the session.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "jsonrpc",
                  "method"
                ],
                "properties": {
                  "jsonrpc": {
                    "type": "string",
                    "enum": [
                      "2.0"
                    ]
                  },
                  "id": {
                    "description": "Request id, echoed on the response."
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "initialize",
                      "tools/list",
                      "tools/call",
                      "resources/list",
                      "resources/read"
                    ]
                  },
                  "params": {
                    "type": "object",
                    "description": "For tools/call: { name: <tool name>, arguments: <that tool's Args schema> }."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC 2.0 response: {jsonrpc, id, result} or {jsonrpc, id, error}.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "list_servicesArgs": {
        "description": "The full Salterwick Property catalogue — every service on offer, with its code, what it covers, which plan it belongs to and how long it takes.",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "list_plansArgs": {
        "description": "Salterwick Property's plans and what each one costs, including which services each tier covers and who it suits.",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "search_knowledgeArgs": {
        "description": "Search everything Salterwick Property publishes — the services, the plan detail and the answers on its FAQ — by keyword. Use this before answering from memory.",
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "A keyword or short phrase, e.g. a service name, a price question or a policy."
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      },
      "get_enquiryArgs": {
        "description": "Look up one enquiry at Salterwick Property by its reference together with the email it was raised under. Both are needed — a reference alone never returns anything.",
        "type": "object",
        "properties": {
          "reference": {
            "type": "string",
            "description": "The reference."
          },
          "email": {
            "type": "string",
            "description": "The email address it belongs to."
          }
        },
        "required": [
          "reference",
          "email"
        ],
        "additionalProperties": false
      },
      "my_enquiriesArgs": {
        "description": "Every enquiry belonging to the SIGNED-IN visitor at Salterwick Property, with its current state and what happens next. Only ever call this for the person actually signed in — never for an address somebody types.",
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "description": "The signed-in visitor's own email address, taken from their identity — never asked for in the chat."
          }
        },
        "required": [
          "email"
        ],
        "additionalProperties": false
      },
      "request_callbackArgs": {
        "description": "Do NOT ask the person for these fields one at a time — calling this with whatever is already known IS how the form opens. Ask for a callback at Salterwick Property, and report back what was recorded.",
        "type": "object",
        "properties": {
          "subject": {
            "type": "string",
            "description": "Which service it concerns — a code from list_services. Leave blank if unknown; the form lets the person pick."
          },
          "summary": {
            "type": "string",
            "description": "One line of detail in the person's own words."
          },
          "urgency": {
            "type": "string",
            "description": "How soon it matters, or the slot they want."
          },
          "name": {
            "type": "string",
            "description": "Who it is for."
          },
          "email": {
            "type": "string",
            "description": "The email the confirmation goes to."
          }
        },
        "additionalProperties": false
      },
      "highlight_serviceArgs": {
        "description": "Scroll Salterwick Property's catalogue to one entry and highlight it on the page the visitor is reading. Runs in the page; it changes what is on screen, not any record.",
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "The catalogue code to bring into view, from list_services."
          }
        },
        "required": [
          "code"
        ],
        "additionalProperties": false
      },
      "open_desk_formArgs": {
        "description": "Open Salterwick Property's ask for a callback form already on this page, with any known details filled in. Runs in the page — it opens a form, it does not submit one.",
        "type": "object",
        "properties": {
          "subject": {
            "type": "string",
            "description": "The catalogue code to preselect."
          },
          "summary": {
            "type": "string",
            "description": "Text to put in the detail field."
          }
        },
        "additionalProperties": false
      }
    }
  }
}
