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
| Tool | What it does |
|---|---|
estimate_cost | Price 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_places | Find 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_scrape | Begin 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_job | Report the state, progress and cost of a job started with start_scrape. |
get_results | Return 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.