Agent quick start
# Mountain Man Plumbing — Agent-Net API
Public pages. Approved images. Small, direct requests. Humans, crawlers and agents are welcome.
Short agent quick start
## Get something done
1. Read the known page directly with ?agentnet=md or MCP read_page. Search only when you need another URL; results contain source links, not generated answers.
2. Read a matching markdown_url or call read_page with its canonical url. Read the page before answering; preserve qualifications, prices, dates and conditions.
3. Cite the canonical human source URL. Check rendered_at, freshness and conversion warnings in JSON. Browser-generated information may require the human page.
4. Use the page's approved images or list_images. Fetch the original only when needed, and carry credit and reuse_instructions with it.
5. Use only the enabled business tools below for the next step, with the required customer approval.
## Enabled business tools
These tools use the existing public CRM intake. No login or API key is required. Customer approval is caller-reported, not identity verification. Booking requests still need normal office confirmation. Contact and booking share submission budgets; respect Retry-After.
- get_booking_services: Get published booking services, service-area ZIPs and current fee disclosure. Use the returned service_id for availability.
- get_availability: Get live available windows for a returned service_id and customer ZIP. Offers expire after ten minutes; availability is not a reservation.
- request_booking: 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.
- submit_contact: 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.
GET current schemas. POST that URL with Content-Type: application/json and an object with name and arguments; MCP uses the same names/inputs.
Resolve a real service ID using get_booking_services; a page title is not an ID.
Check openings with a real service_id and the customer's ZIP. Read the returned timezone, source observation time, response time, expiry and fee terms. An offer does not hold capacity. A failed read is not no availability.
This MMOS schedule covers today through the next 21 days; ask the office about later dates. Offers expire in ten minutes. generated_at=null means the source did not supply a timestamp; response_at records when this response was made.
Before a write, obtain approval of the customer's details, selected service/window and disclosed fee where required. Follow the schema. Keep personal data in POST bodies. Reuse request_id and identical arguments on retries; receipts last 30 days. outcome_unknown means stop and ask the office to check, not submit under a new key. Return the actual receipt state; pending office confirmation is not a confirmed appointment.
## Discovery and page context
ARD catalog · Compatibility catalog · Reading map · Experimental MCP card
The catalogs are generated from one registry. ARD v0.91 and the experimental server card are additional discovery routes; they do not grant permission or imply automatic support by a client. MCP tools/list remains authoritative.
Page JSON includes context.kind, mapping_status, service and at most three next_actions. Purpose is configured by the site owner, not inferred from a private prompt. An unmapped service page offers a selector or office inquiry. Follow the supplied links: agentnet=task renders script-free HTML; agentnet_display=raw returns JSON. Read tasks accept only declared service_id, zip, date or query inputs. Write-task links explain the POST operation and never submit.
Optional service-request skill — load deliberately in a compatible client; this URL does not install a connector.
Search accepts 2–120 characters and returns up to 20 results per page. It searches WordPress titles and stored page content; JavaScript widgets and builder-only metadata may not match. Try fewer keywords or browse list_pages when needed.
### HTTP workflow example
```sh
curl --get 'https://mtnmanplumbing.com/?agentnet=search' --data-urlencode 'q=services'
# Read a returned markdown_url, then cite its corresponding canonical url.
```
### MCP workflow example
Add the endpoint below to a client that supports remote Streamable HTTP MCP servers. After connecting, ask it to search this site, read the matching pages, cite their source URLs, and include approved pictures when useful.
```json
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_pages","arguments":{"query":"services"}}}
```
Use the transport headers and version handshake described below. No browser intro is needed.
## Quick start
- Read the homepage as Markdown
- Browse the public page index
- Browse approved images
- Download the OpenAPI schema
- Read the discovery manifest
## HTTP API
Add the agentnet query parameter to the canonical human page URL. Preserve an existing query string and append &agentnet=md when necessary.
| Method | Query | Result |
| --- | --- | --- |
| GET / HEAD | agentnet=md | Markdown text, canonical source and approved image URLs |
| GET / HEAD | agentnet=json | Markdown plus title, outline, links, images, revision and conversion warnings |
| GET / HEAD | agentnet=index | Public page index; follow Next page |
| GET / HEAD | agentnet=search&q=keywords | Public page search with canonical and reading URLs |
| GET / HEAD | agentnet=images | Approved image catalog; follow next or next_page |
| GET / HEAD | agentnet=docs | Short agent quick start; add agentnet_detail=full for this reference |
| GET / HEAD | agentnet=guide | The same instructions as lightweight HTML for browsers; supports agentnet_detail=full |
| GET / HEAD | agentnet=manifest | Endpoint map and a suggested reading workflow |
| GET / HEAD | agentnet=openapi | OpenAPI 3.1.2 document |
| GET / HEAD | agentnet=view | Optional terminal for people; agents should use md or json |
| POST | agentnet=mcp | MCP JSON-RPC, enabled tools |
| GET / POST | agentnet=actions | Business tool schemas / invoke a tool |
Use the home URL for search, index, images, docs, manifest, openapi, actions and mcp. Page and image catalogs are paginated at 50 items, search at 20, using agentnet_page=2 and onward. Follow the returned next URL; a page may contain fewer visible results after exclusions.
```sh
curl -H 'Accept: text/markdown' 'https://mtnmanplumbing.com/?agentnet=md'
```
## MCP connection
Endpoint: https://mtnmanplumbing.com/?agentnet=mcp
Transport: Streamable HTTP with JSON responses. No persistent connection, SSE subscription or session ID is needed. This server supports 2026-07-28 and the initialization-based 2025-11-25, 2025-06-18 and 2025-03-26 revisions.
Content tools: search_pages, list_pages, read_page, list_images, get_api_docs. These only read public information. Enabled business tools are listed above. Their annotations and schemas identify required inputs and approval.
### Clients using initialization
POST this JSON to the MCP endpoint with Content-Type: application/json and Accept: application/json, text/event-stream:
```json
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"your-agent","version":"1.0"}}}
```
Send notifications/initialized next, without an id. On subsequent POST requests include MCP-Protocol-Version: 2025-11-25. Call tools/list to inspect the input schemas. Then read a page:
```json
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"read_page","arguments":{"url":"https://mtnmanplumbing.com/"}}}
```
### Clients using 2026-07-28
Each request includes params._meta with io.modelcontextprotocol/protocolVersion set to 2026-07-28 and io.modelcontextprotocol/clientCapabilities set to an object. Include matching MCP-Protocol-Version and Mcp-Method headers; tools/call also requires Mcp-Name matching params.name. server/discover reports versions and capabilities. No initialize handshake is used for this revision.
```json
{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}
```
Tool arguments: search_pages requires query (2–120 characters) and accepts optional page; list_pages accepts optional page (default 1); list_images accepts page, query (up to 120 characters), limit (1–50) and after (nonnegative cursor); read_page requires a canonical public URL from this site; get_api_docs accepts no arguments. Unknown arguments are rejected. The MCP request limit is 64 KiB and 120 tool calls per minute per network source. An upstream proxy may apply additional limits.
## Images
Image records contain url (original), preview_url (smaller display image), source_page_url, source_title, alt, caption, dimensions, credit and reuse_instructions. Search with q on HTTP or query on MCP list_images. Image pages contain only visible approved records. HTTP agentnet_limit (MCP limit) accepts 1–50; use the returned next URL or next_after as MCP after to continue without rescanning earlier pages. Keep query and limit unchanged when using a cursor. Markdown retains original image URLs. Add agentnet_display=html to md, json, index, images, search, openapi or manifest for a script-free browser representation; the guide links select these automatically. The browser image catalog defaults to 12 lazy-loaded previews; raw HTTP and MCP default to 50 records. The visual terminal also uses lazy-loaded previews when available. Follow the supplied reuse instructions; approval does not create a new license. Images attached to private or password-protected posts remain excluded. An image can be revoked in the Media Library.
## Content, freshness and search
The page API and MCP read_page use the same WordPress template render as the human page, then remove scripts, styles and layout markup. This is not AI-written replacement copy. The human URL remains canonical. Raw endpoints do not load the terminal assets or run an intro.
Content is rendered for each request. Responses use Cache-Control: no-store. Browser-generated booking availability, maps, reviews and other live interactions may require the human page; check warnings and freshness in the JSON document. Text in collapsed HTML sections is retained. This is not a guarantee of parity for every theme, membership plugin or client-side widget.
## Access and errors
Only published, unpassworded, supported public pages are available. Use a signed-out WordPress context. No WordPress password or application password is required. Hosting access controls still apply: a staging site behind Cloudflare Access requires its normal Access authorization. The plugin does not bypass that gate. Browser Origins must match this site's origin for MCP; non-browser MCP clients may omit Origin.
HTTP: 400 invalid format/request; 404 unavailable public page; 405 wrong method; 409 logged-in context; 503 unsupported conversion. MCP additionally uses 403 for invalid Origin, 406 for incompatible Accept, 413 for oversized requests, 415 for wrong Content-Type and 429 with Retry-After for rate limits. Protocol failures return JSON-RPC errors; readable tool failures return content with isError=true. Business responses also carry success and status: inspect them rather than relying on HTTP 200 alone.
Human homepage · Markdown documentation · OpenAPI schema