API and business tool schemas

{
    "openapi": "3.1.2",
    "info": {
        "title": "Mountain Man Plumbing — Agent-Net",
        "version": "0.7.6",
        "description": "Public content and optional business tools. Hosting access restrictions still apply."
    },
    "servers": [
        {
            "url": "https://mtnmanplumbing.com"
        }
    ],
    "paths": {
        "/": {
            "get": {
                "summary": "Read a public page or site resource",
                "parameters": [
                    {
                        "name": "agentnet",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "md",
                                "json",
                                "index",
                                "images",
                                "docs",
                                "guide",
                                "openapi",
                                "view",
                                "search",
                                "manifest",
                                "ard",
                                "catalog",
                                "card",
                                "llms",
                                "skill",
                                "task",
                                "actions"
                            ]
                        }
                    },
                    {
                        "name": "agentnet_display",
                        "in": "query",
                        "description": "Explicit browser-readable HTML for page/catalog/schema reads; raw preserves the native Markdown or JSON. Task pages default to html; discovery files always return their native format.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "raw",
                                "html"
                            ],
                            "default": "raw"
                        }
                    },
                    {
                        "name": "agentnet_limit",
                        "in": "query",
                        "description": "Image catalog page size; browser default 12, raw default 50.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50
                        }
                    },
                    {
                        "name": "agentnet_after",
                        "in": "query",
                        "description": "Image cursor returned as next_after; keep query and limit unchanged.",
                        "schema": {
                            "type": "integer",
                            "minimum": 0
                        }
                    },
                    {
                        "name": "agentnet_detail",
                        "in": "query",
                        "description": "For agentnet=docs or guide: quickstart is the compact entry; full includes transport examples and complete reference.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "quickstart",
                                "full"
                            ],
                            "default": "quickstart"
                        }
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "description": "Search pages requires 2–120 characters. Image keywords are optional (0–120); match alt, caption, URL and source title.",
                        "schema": {
                            "type": "string",
                            "maxLength": 120
                        }
                    },
                    {
                        "name": "agentnet_tool",
                        "in": "query",
                        "description": "For task only: an enabled operation; GET never submits.",
                        "schema": {
                            "type": "string",
                            "examples": [
                                "get_booking_services",
                                "get_availability",
                                "request_booking",
                                "submit_contact"
                            ]
                        }
                    },
                    {
                        "name": "service_id",
                        "in": "query",
                        "description": "Exact ID returned by the installed booking adapter.",
                        "schema": {
                            "type": "string",
                            "maxLength": 80
                        }
                    },
                    {
                        "name": "zip",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9]{5}$"
                        }
                    },
                    {
                        "name": "date",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "query",
                        "in": "query",
                        "description": "Task service search, when declared by its schema.",
                        "schema": {
                            "type": "string",
                            "maxLength": 120
                        }
                    },
                    {
                        "name": "agentnet_page",
                        "in": "query",
                        "description": "Search and index window: pages 1–100. Images require next_after beyond legacy page 5.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100,
                            "default": 1
                        }
                    },
                    {
                        "name": "page_id",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "WordPress plain-permalink page ID."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Selected representation; page JSON contains markdown, outline, images, warnings and canonical_url.",
                        "content": {
                            "text/markdown": {
                                "schema": {
                                    "type": "string"
                                }
                            },
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            },
                            "text/html": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Invalid format or parameter"
                    },
                    "404": {
                        "description": "No public document"
                    },
                    "409": {
                        "description": "Signed-out public context required"
                    },
                    "503": {
                        "description": "Conversion unavailable"
                    },
                    "429": {
                        "description": "Request budget exceeded; honor Retry-After."
                    }
                }
            },
            "post": {
                "summary": "Call MCP or direct business tools",
                "parameters": [
                    {
                        "name": "agentnet",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "mcp",
                                "actions"
                            ]
                        }
                    },
                    {
                        "name": "Mcp-Protocol-Version",
                        "in": "header",
                        "description": "MCP only. For modern requests this must match params._meta protocolVersion; omit for actions.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "2026-07-28",
                                "2025-11-25",
                                "2025-06-18",
                                "2025-03-26"
                            ]
                        }
                    },
                    {
                        "name": "Mcp-Method",
                        "in": "header",
                        "description": "Required for modern MCP: exact JSON-RPC method.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "Mcp-Name",
                        "in": "header",
                        "description": "Required for modern MCP tools/call: exact params.name.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "oneOf": [
                                    {
                                        "type": "object",
                                        "required": [
                                            "jsonrpc",
                                            "method"
                                        ],
                                        "properties": {
                                            "jsonrpc": {
                                                "const": "2.0"
                                            },
                                            "id": {
                                                "type": [
                                                    "string",
                                                    "integer"
                                                ]
                                            },
                                            "method": {
                                                "type": "string"
                                            },
                                            "params": {
                                                "type": "object"
                                            }
                                        }
                                    },
                                    {
                                        "oneOf": [
                                            {
                                                "type": "object",
                                                "required": [
                                                    "name",
                                                    "arguments"
                                                ],
                                                "additionalProperties": false,
                                                "properties": {
                                                    "name": {
                                                        "const": "get_booking_services"
                                                    },
                                                    "arguments": {
                                                        "type": "object",
                                                        "properties": {
                                                            "query": {
                                                                "type": "string",
                                                                "minLength": 0,
                                                                "maxLength": 120
                                                            }
                                                        },
                                                        "required": [],
                                                        "additionalProperties": false
                                                    }
                                                }
                                            },
                                            {
                                                "type": "object",
                                                "required": [
                                                    "name",
                                                    "arguments"
                                                ],
                                                "additionalProperties": false,
                                                "properties": {
                                                    "name": {
                                                        "const": "get_availability"
                                                    },
                                                    "arguments": {
                                                        "type": "object",
                                                        "properties": {
                                                            "service_id": {
                                                                "type": "string",
                                                                "minLength": 1,
                                                                "maxLength": 80
                                                            },
                                                            "zip": {
                                                                "type": "string",
                                                                "minLength": 5,
                                                                "maxLength": 5
                                                            },
                                                            "date": {
                                                                "type": "string",
                                                                "minLength": 0,
                                                                "maxLength": 10
                                                            }
                                                        },
                                                        "required": [
                                                            "service_id",
                                                            "zip"
                                                        ],
                                                        "additionalProperties": false
                                                    }
                                                }
                                            },
                                            {
                                                "type": "object",
                                                "required": [
                                                    "name",
                                                    "arguments"
                                                ],
                                                "additionalProperties": false,
                                                "properties": {
                                                    "name": {
                                                        "const": "request_booking"
                                                    },
                                                    "arguments": {
                                                        "type": "object",
                                                        "properties": {
                                                            "request_id": {
                                                                "type": "string",
                                                                "minLength": 16,
                                                                "maxLength": 96
                                                            },
                                                            "name": {
                                                                "type": "string",
                                                                "minLength": 2,
                                                                "maxLength": 120
                                                            },
                                                            "phone": {
                                                                "type": "string",
                                                                "minLength": 0,
                                                                "maxLength": 24
                                                            },
                                                            "email": {
                                                                "type": "string",
                                                                "minLength": 0,
                                                                "maxLength": 254
                                                            },
                                                            "message": {
                                                                "type": "string",
                                                                "minLength": 2,
                                                                "maxLength": 4000
                                                            },
                                                            "user_confirmed": {
                                                                "type": "boolean",
                                                                "const": true
                                                            },
                                                            "offer_token": {
                                                                "type": "string",
                                                                "minLength": 20,
                                                                "maxLength": 4096
                                                            },
                                                            "street": {
                                                                "type": "string",
                                                                "minLength": 3,
                                                                "maxLength": 200
                                                            },
                                                            "city": {
                                                                "type": "string",
                                                                "minLength": 2,
                                                                "maxLength": 100
                                                            },
                                                            "state": {
                                                                "type": "string",
                                                                "minLength": 2,
                                                                "maxLength": 2
                                                            },
                                                            "zip": {
                                                                "type": "string",
                                                                "minLength": 5,
                                                                "maxLength": 5
                                                            },
                                                            "fee_agreed": {
                                                                "type": "boolean"
                                                            }
                                                        },
                                                        "required": [
                                                            "request_id",
                                                            "name",
                                                            "phone",
                                                            "message",
                                                            "user_confirmed",
                                                            "offer_token",
                                                            "street",
                                                            "city",
                                                            "state",
                                                            "zip",
                                                            "fee_agreed"
                                                        ],
                                                        "additionalProperties": false
                                                    }
                                                }
                                            },
                                            {
                                                "type": "object",
                                                "required": [
                                                    "name",
                                                    "arguments"
                                                ],
                                                "additionalProperties": false,
                                                "properties": {
                                                    "name": {
                                                        "const": "submit_contact"
                                                    },
                                                    "arguments": {
                                                        "type": "object",
                                                        "properties": {
                                                            "request_id": {
                                                                "type": "string",
                                                                "minLength": 16,
                                                                "maxLength": 96
                                                            },
                                                            "name": {
                                                                "type": "string",
                                                                "minLength": 2,
                                                                "maxLength": 120
                                                            },
                                                            "phone": {
                                                                "type": "string",
                                                                "minLength": 0,
                                                                "maxLength": 24
                                                            },
                                                            "email": {
                                                                "type": "string",
                                                                "minLength": 0,
                                                                "maxLength": 254
                                                            },
                                                            "message": {
                                                                "type": "string",
                                                                "minLength": 2,
                                                                "maxLength": 4000
                                                            },
                                                            "user_confirmed": {
                                                                "type": "boolean",
                                                                "const": true
                                                            }
                                                        },
                                                        "required": [
                                                            "request_id",
                                                            "name",
                                                            "message",
                                                            "user_confirmed"
                                                        ],
                                                        "additionalProperties": false
                                                    }
                                                }
                                            }
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "MCP JSON-RPC result or tool error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "202": {
                        "description": "Legacy notification accepted"
                    },
                    "400": {
                        "description": "Malformed JSON-RPC or protocol/header mismatch"
                    },
                    "429": {
                        "description": "Tool read limit exceeded"
                    }
                },
                "description": "For MCP, send Accept: application/json, text/event-stream and Content-Type: application/json. Modern requests also require matching Mcp-* headers and params._meta protocolVersion/clientCapabilities. For actions, POST name/arguments as application/json. Public writes use the normal CRM intake; HTTP 429 includes Retry-After. WordPress-authenticated action sessions are refused."
            }
        },
        "/{pagePath}": {
            "get": {
                "summary": "Read a public page or site resource",
                "parameters": [
                    {
                        "name": "pagePath",
                        "in": "path",
                        "required": true,
                        "description": "Public WordPress path, including nested segments. For plain permalinks, use / with page_id.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "agentnet",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "md",
                                "json",
                                "index",
                                "images",
                                "docs",
                                "guide",
                                "openapi",
                                "view",
                                "search",
                                "manifest",
                                "ard",
                                "catalog",
                                "card",
                                "llms",
                                "skill",
                                "task"
                            ]
                        }
                    },
                    {
                        "name": "agentnet_display",
                        "in": "query",
                        "description": "Explicit browser-readable HTML for page/catalog/schema reads; raw preserves the native Markdown or JSON. Task pages default to html; discovery files always return their native format.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "raw",
                                "html"
                            ],
                            "default": "raw"
                        }
                    },
                    {
                        "name": "agentnet_limit",
                        "in": "query",
                        "description": "Image catalog page size; browser default 12, raw default 50.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50
                        }
                    },
                    {
                        "name": "agentnet_after",
                        "in": "query",
                        "description": "Image cursor returned as next_after; keep query and limit unchanged.",
                        "schema": {
                            "type": "integer",
                            "minimum": 0
                        }
                    },
                    {
                        "name": "agentnet_detail",
                        "in": "query",
                        "description": "For agentnet=docs or guide: quickstart is the compact entry; full includes transport examples and complete reference.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "quickstart",
                                "full"
                            ],
                            "default": "quickstart"
                        }
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "description": "Search pages requires 2–120 characters. Image keywords are optional (0–120); match alt, caption, URL and source title.",
                        "schema": {
                            "type": "string",
                            "maxLength": 120
                        }
                    },
                    {
                        "name": "agentnet_tool",
                        "in": "query",
                        "description": "For task only: an enabled operation; GET never submits.",
                        "schema": {
                            "type": "string",
                            "examples": [
                                "get_booking_services",
                                "get_availability",
                                "request_booking",
                                "submit_contact"
                            ]
                        }
                    },
                    {
                        "name": "service_id",
                        "in": "query",
                        "description": "Exact ID returned by the installed booking adapter.",
                        "schema": {
                            "type": "string",
                            "maxLength": 80
                        }
                    },
                    {
                        "name": "zip",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9]{5}$"
                        }
                    },
                    {
                        "name": "date",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "query",
                        "in": "query",
                        "description": "Task service search, when declared by its schema.",
                        "schema": {
                            "type": "string",
                            "maxLength": 120
                        }
                    },
                    {
                        "name": "agentnet_page",
                        "in": "query",
                        "description": "Search and index window: pages 1–100. Images require next_after beyond legacy page 5.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100,
                            "default": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Selected representation; page JSON contains markdown, outline, images, warnings and canonical_url.",
                        "content": {
                            "text/markdown": {
                                "schema": {
                                    "type": "string"
                                }
                            },
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            },
                            "text/html": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Invalid format or parameter"
                    },
                    "404": {
                        "description": "No public document"
                    },
                    "409": {
                        "description": "Signed-out public context required"
                    },
                    "503": {
                        "description": "Conversion unavailable"
                    },
                    "429": {
                        "description": "Request budget exceeded; honor Retry-After."
                    }
                }
            }
        }
    },
    "externalDocs": {
        "description": "API and MCP guide",
        "url": "https://mtnmanplumbing.com/?agentnet=docs"
    },
    "x-agentnet-business-tools": [
        {
            "name": "get_booking_services",
            "description": "Get published booking services, service-area ZIPs and current fee disclosure. Use the returned service_id for availability.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "minLength": 0,
                        "maxLength": 120
                    }
                },
                "required": [],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false
            }
        },
        {
            "name": "get_availability",
            "description": "Get live available windows for a returned service_id and customer ZIP. Offers expire after ten minutes; availability is not a reservation.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "service_id": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 80
                    },
                    "zip": {
                        "type": "string",
                        "minLength": 5,
                        "maxLength": 5
                    },
                    "date": {
                        "type": "string",
                        "minLength": 0,
                        "maxLength": 10
                    }
                },
                "required": [
                    "service_id",
                    "zip"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false
            }
        },
        {
            "name": "request_booking",
            "description": "Submit the customer-approved service request through the normal CRM booking form. Requires a live offer_token, complete contact/address details and agreement to the disclosed fee. Creates a request for office confirmation, not a guaranteed appointment. Reuse request_id on retries.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "request_id": {
                        "type": "string",
                        "minLength": 16,
                        "maxLength": 96
                    },
                    "name": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 120
                    },
                    "phone": {
                        "type": "string",
                        "minLength": 0,
                        "maxLength": 24
                    },
                    "email": {
                        "type": "string",
                        "minLength": 0,
                        "maxLength": 254
                    },
                    "message": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 4000
                    },
                    "user_confirmed": {
                        "type": "boolean",
                        "const": true
                    },
                    "offer_token": {
                        "type": "string",
                        "minLength": 20,
                        "maxLength": 4096
                    },
                    "street": {
                        "type": "string",
                        "minLength": 3,
                        "maxLength": 200
                    },
                    "city": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 100
                    },
                    "state": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 2
                    },
                    "zip": {
                        "type": "string",
                        "minLength": 5,
                        "maxLength": 5
                    },
                    "fee_agreed": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "request_id",
                    "name",
                    "phone",
                    "message",
                    "user_confirmed",
                    "offer_token",
                    "street",
                    "city",
                    "state",
                    "zip",
                    "fee_agreed"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": false,
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true
            }
        },
        {
            "name": "submit_contact",
            "description": "Send a customer-approved message to the business through its normal CRM contact form. Provide a valid phone or email. Reuse request_id on retries.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "request_id": {
                        "type": "string",
                        "minLength": 16,
                        "maxLength": 96
                    },
                    "name": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 120
                    },
                    "phone": {
                        "type": "string",
                        "minLength": 0,
                        "maxLength": 24
                    },
                    "email": {
                        "type": "string",
                        "minLength": 0,
                        "maxLength": 254
                    },
                    "message": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 4000
                    },
                    "user_confirmed": {
                        "type": "boolean",
                        "const": true
                    }
                },
                "required": [
                    "request_id",
                    "name",
                    "message",
                    "user_confirmed"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": false,
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true
            }
        }
    ]
}