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
}
}
]
}