Documentation

API & MCP server

Last updated October 24, 2026

Overview

reachpony is a directory of local home-service businesses (plumbing, HVAC, roofing, electrical and more). Each profile is built from the business's own website: the services it offers, its service area, emergency and same-day availability, licenses, published prices, brands serviced, and how to get a quote or book.

Who it's for: people and AI agents looking for a pro for a specific job, such as "a plumber in Round Rock who repairs tankless water heaters and does emergency calls".

What it does: search by job, trade, requirement and location; open one business's full profile; list which metros and trades are covered.

Why use it instead of a browser: an agent gets businesses filtered by the exact service and requirements in one call, as structured JSON, instead of opening and reading a dozen business websites to find out who does the job, who serves the area and who answers at night.

Restrictions: United States only. It currently covers Atlanta, Austin, Dallas-Fort Worth, Houston and Phoenix; other locations return covered: false and a message, never an empty list presented as a result. Coverage grows over time; call list_coverage for the current list. Free, no account, no plan, no age limit. Content is in English.

What it does not do: reachpony does not book jobs, take payments, send messages or contact businesses. It returns contact and booking details; the user contacts the business directly.

Setup

MCP endpoint https://reachpony.com/mcp
Transport Streamable HTTP, stateless (no session id), JSON responses
Authentication None. No OAuth, no API key, no scopes.
Test vs production One production endpoint. There are no credentials and no test account to set up; every tool is read-only, so testing against production has no side effects.
JSON API https://reachpony.com/v1/ (same data, see JSON API)
Agent summary /llms.txt

Client configuration (Claude Code, Cursor and most MCP clients):

{
  "mcpServers": {
    "reachpony": { "type": "http", "url": "https://reachpony.com/mcp" }
  }
}

Try it with the MCP Inspector (npx @modelcontextprotocol/inspector, Streamable HTTP), or with curl:

curl https://reachpony.com/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Tools

Every tool is Read. None is a Write or a Sensitive write: no tool creates, changes, sends, shares, publishes or pays for anything, here or at a business. Each tool carries the MCP annotations readOnlyHint: true, destructiveHint: false, idempotentHint: true and openWorldHint: false.

Tool Classification Sensitive Side effects Permissions
search_businesses Read No None (the query is logged without user identifiers, see Data) None needed
get_business Read No None (the id is logged) None needed
list_coverage Read No None None needed

Because there is no sign-in, there are no user accounts to read from and no separate read-only permission to grant: the whole server is read-only.

search_businesses

Find businesses near a US city or ZIP code. service is the most precise filter; trade matches a kind of business; flags are requirements a business must all meet. 10 results per page.

Input Type Required Description
location string Yes City ("Round Rock, TX"), county, metro or 5-digit ZIP code.
service string[] (enum), max 10 No Service codes such as plumbing.water_heater_repair. Matches businesses offering any of them. Codes: /v1/taxonomy.
trade string[] (enum), max 10 No Trade codes (list). Matches businesses in any of them. Not needed when service is given.
flags string[] (enum), max 10 No Requirements such as emergency_24_7 (list). A business must have all of them.
query string, max 200 No Keywords matched against names, summaries and services, e.g. a brand ("Rheem") or a business name.
page integer, 1–20 No Default 1.

Output (structuredContent, with the same JSON as text):

Field Description
covered false when the location or trade isn't covered yet. message then says what is covered.
message Human-readable note, or null.
resolved How the request was understood: location (label, metro), services, trades, flags, text. Show this to the user when it differs from what they asked.
results Organic results, ranked. Each has id, name, url (profile page), trades, city, metro, summary, services, flags, contact (phone, email, quote_url, booking_url, booking_platform, quotes), website, rating, review_count. Fields a business doesn't have are left out.
sponsored Paid placements, same shape plus "sponsored": true. Page 1 only, never mixed into results or their ranking. Label them as sponsored when you show them.
page, total_pages, total_results, next_page Paging. next_page is null on the last page.
{
  "covered": true,
  "message": null,
  "resolved": {
    "text": "",
    "location": { "label": "Austin, TX", "metro": "austin" },
    "services": ["plumbing.water_heater_repair"],
    "trades": [],
    "flags": ["emergency_24_7"]
  },
  "page": 1,
  "total_pages": 16,
  "total_results": 156,
  "next_page": 2,
  "results": [
    {
      "id": "hambone-plumbing-and-septic-pumping",
      "name": "Hambone Plumbing and Septic Pumping",
      "url": "https://reachpony.com/b/hambone-plumbing-and-septic-pumping",
      "trades": ["plumbing", "appliance_repair", "septic"],
      "city": "Taylor",
      "metro": "austin",
      "summary": "Family-owned plumbing and septic pumping company serving Taylor and Central Texas since 1982, …",
      "services": ["plumbing.drain_cleaning", "plumbing.water_heater_repair", "…"],
      "flags": ["emergency_24_7", "same_day", "free_estimates", "…"],
      "contact": { "phone": "+15125030323", "quotes": "Quotes by online form or phone" },
      "website": "https://hamboneplumbing.com",
      "rating": 4.9,
      "review_count": 178
    }
  ],
  "sponsored": []
}

get_business

The full profile of one business.

Input Type Required Description
id string Yes An id from search_businesses. Old ids of renamed businesses still resolve.

Output: every field of a search result, plus address, zip, founded_year, team_size_band, maps_url, updated_at (when the profile was last refreshed), highlights, service_area, licenses, prices (as published by the business; not quotes), brands and rating_source ("Google" when a rating is present). Fields a business doesn't have are left out.

list_coverage

No inputs. Returns the metros and trades currently indexed, with business counts and the last refresh date.

{
  "refreshed_at": "2026-10-13T13:15:32Z",
  "metros": [
    {
      "metro": "austin",
      "label": "Austin",
      "trades": [{ "code": "plumbing", "label": "Plumbing", "businesses": 400 }, …]
    }
  ]
}

Status handling

Every tool is idempotent and has no side effects, so any call can be retried safely. There are no pending, confirmed or cancelled states: reachpony never starts a transaction.

Errors

Invalid arguments come back as a tool result with isError: true and a message that says how to fix the call, so the model can correct itself:

Cause Message (example)
Missing location `location` is required: a city, county, metro or ZIP code.
Unknown service code Unknown service code "plumbing". "plumbing" is a trade: pass it as `trade` instead.
Unknown trade or flag Unknown trade "plumber". Valid trades: …
Too many values At most 10 values each for service, trade and flags.
Page out of range `page` must be between 1 and 20.
Unknown id No business with id "…". Ids come from search_businesses.
Search backend down Temporarily unavailable, please retry.

An unknown tool name is a JSON-RPC invalid_params error. Over HTTP (MCP and JSON API): 400 bad arguments, 404 unknown id or endpoint, 429 rate limited, 503 temporarily unavailable. JSON API errors are {"error": "…"}.

Rate limits

/mcp and /v1/* share a per-IP limit: bursts of 30 requests, then 4 per second. Over the limit, the response is HTTP 429 with Retry-After in whole seconds (often 0): wait that long, and at least 250 ms, then retry. Request bodies are limited to 64 KB. Need more? Write to [email protected].

JSON API

The same data over plain HTTP GET, for clients that don't speak MCP. CORS is open; no auth.

Endpoint Equivalent
GET /v1/search with location, service, trade, flag (repeat or comma-separate), q, page search_businesses
GET /v1/business/{id} (an old id answers 301 to the current one) get_business
GET /v1/coverage list_coverage
GET /v1/taxonomy Every trade, service and flag code with its label

Codes

Trades:

Flags:

Service codes (trade.service) are listed with descriptions at /v1/taxonomy and as enums in the tool schema.

Example prompts

Data & security

Full details: Privacy policy and Terms.

Support