{"openapi":"3.1.0","info":{"title":"4 Elements Painting — agent tools API","version":"1.0.0","description":"Read-only tools for AI agents and developers: business details, service areas, services, guides and FAQs for 4 Elements Painting, house painters in Newcastle NSW. No auth. Quote requests are not accepted through this API.","contact":{"name":"4 Elements Painting","email":"info@4elementspainting.com.au","url":"https://www.4elementspainting.com.au/developers"}},"externalDocs":{"description":"AI Agents & Developers Guide","url":"https://www.4elementspainting.com.au/developers"},"servers":[{"url":"https://www.4elementspainting.com.au"}],"tags":[{"name":"Tools","description":"One GET endpoint per tool; query parameters follow the tool input schema."},{"name":"MCP","description":"The same tools over the Model Context Protocol."}],"paths":{"/api/tools/get_business_info":{"get":{"operationId":"get_business_info","summary":"Get business details","description":"Get verified contact and trust details for 4 Elements Painting, a house-painting business in Newcastle NSW, Australia: phone, email, opening hours, NSW contractor licence, workmanship warranty, Google rating, the regions it serves and how to get a free quote.","tags":["Tools"],"parameters":[],"responses":{"200":{"description":"Tool result.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/tools/check_service_area":{"get":{"operationId":"check_service_area","summary":"Check a suburb is serviced","description":"Check whether 4 Elements Painting works in a suburb, town or region of NSW, and get the matching local pages. Answers come from the published service-area list. A place that is not on the list is reported as not listed (not refused), with the phone number to confirm.","tags":["Tools"],"parameters":[{"name":"suburb","in":"query","required":true,"description":"Suburb, town or region, e.g. \"Merewether\", \"Lake Macquarie\" or \"Nelson Bay\". Postcodes are not supported.","schema":{"type":"string","minLength":2,"maxLength":60}}],"responses":{"200":{"description":"Tool result.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/tools/list_services":{"get":{"operationId":"list_services","summary":"List painting services","description":"List the painting services 4 Elements Painting offers now, each with a short summary and the page that describes it. Only live services are returned.","tags":["Tools"],"parameters":[],"responses":{"200":{"description":"Tool result.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/tools/search_guides":{"get":{"operationId":"search_guides","summary":"Search painting guides","description":"Search the site's painting guides (costs, preparation, colours, paint types and finishes, maintenance, choosing a painter) and return the best-matching pages with summaries. Use this for price questions too: the cost guides give the published price ranges and what moves them. No tool estimates the price of a specific job; that comes from a free quote.","tags":["Tools"],"parameters":[{"name":"query","in":"query","required":false,"description":"What the visitor wants to know, e.g. \"exterior painting cost\" or \"peeling paint\".","schema":{"type":"string","maxLength":120}},{"name":"category","in":"query","required":false,"description":"Optional category filter.","schema":{"type":"string","enum":["Colour","Cost","Prep","Finishes","Advice","Maintenance","Commercial","Planning"]}},{"name":"limit","in":"query","required":false,"description":"Maximum results (1–10, default 5).","schema":{"type":"integer","minimum":1,"maximum":10,"default":5}}],"responses":{"200":{"description":"Tool result.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/tools/get_faqs":{"get":{"operationId":"get_faqs","summary":"Get FAQ answers","description":"Get answers from the site's FAQ page about pricing, process, timelines, warranty and licensing, word for word as published. Optionally filter by category or search text.","tags":["Tools"],"parameters":[{"name":"category","in":"query","required":false,"description":"Optional category filter.","schema":{"type":"string","enum":["Pricing","Process","Timeline","Warranty"]}},{"name":"query","in":"query","required":false,"description":"Optional search text, e.g. \"warranty\" or \"rain\".","schema":{"type":"string","maxLength":120}}],"responses":{"200":{"description":"Tool result.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/mcp":{"post":{"operationId":"mcp","summary":"MCP server (JSON-RPC 2.0, Streamable HTTP)","description":"Model Context Protocol endpoint. Supports initialize, ping, tools/list and tools/call for the same tools as /api/tools/{name}. Stateless, no auth, JSON responses only.","tags":["MCP"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"const":"2.0"},"id":{"type":["string","integer"]},"method":{"type":"string","enum":["initialize","ping","tools/list","tools/call"]},"params":{"type":"object"}}},"example":{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_service_area","arguments":{"suburb":"Merewether"}}}}}},"responses":{"200":{"description":"JSON-RPC response.","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"Notification accepted (no body)."}}}}}}