Model Context Protocol

Model Context Protocol

This service is available to agents as a set of tools, at https://mapcensus.com/mcp.

Connecting

{
  "mcpServers": {
    "mapcensus": {
      "type": "http",
      "url": "https://mapcensus.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}

Transport is Streamable HTTP, protocol 2026-07-28. A single endpoint takes JSON-RPC by POST and answers application/json.

That revision is stateless: there is no initialize handshake and no session. Every request carries its own protocol version and client capabilities under _meta, mirrored into the MCP-Protocol-Version, Mcp-Method and Mcp-Name headers - which must agree with the body, or the request is refused. Call server/discover to read the versions, capabilities and identity in one round trip.

Older clients still work. This endpoint also answers the handshake era - initialize, a session id, and ping - for clients speaking 2025-06-18 and earlier. Which era a request belongs to is decided by the request itself, so both are served side by side and nothing has to be configured.

Tools

ToolWhat it does
estimate_costPrice a Google Maps search without running it. Free, instant, and the right first call when a budget matters. Also reports whether a cached answer already exists, which is much cheaper.
search_placesFind businesses on Google Maps and return them as structured rows - name, address, hours, phone, rating, reviews and more, read from the public listing. Answers within one call, up to 60 results. Use this for anything interactive. For larger pulls use start_scrape instead. Without an account, a search that cannot finish within the call is stopped and not charged.
start_scrapeBegin an extraction of up to 5000 Google Maps listings and return a job id immediately. Poll get_job, then fetch with get_results. Use this whenever the result would be too large to wait for. Needs an account (an API key): a job is collected by its owner, so a caller paying per call without one is refused before any price is quoted.
get_jobReport the state, progress and cost of a job started with start_scrape.
get_resultsReturn the rows from a finished job. Paginated, because a large result will not fit in one model context - request successive offsets.

Paying without a key

An agent with a wallet needs no account. Call a tool with no key and the result comes back with isError set, carrying the x402 PaymentRequired object as its structuredContent and as JSON in content[0].text. Sign one of the quoted terms and call again with the payload under _meta["x402/payment"]; the settlement receipt comes back under _meta["x402/payment-response"]. Over plain HTTP the same payload goes in the Payment-Signature header (x402 v2 only; a v1 X-Payment is not read). The payment buys that call and nothing more: no balance is kept for a wallet that holds no credential, so each call carries its own payment. A request that returns no rows is not charged; the payment can be presented again to retry that same request, up to 3 attempts in all, within 6 minutes of the first. It answers within the call, so start_scrape - whose job only its owner can collect - needs an API key. An agent that wants to pay once for many calls uses an API key on a funded account.

Spending less

estimate_cost is free and reports both the fresh price and whether a cached answer exists. Prefer depth: "listing" unless contact details or hours are needed. Raise max_age_seconds whenever a slightly older answer will do.