Skip to content
All posts

How to find local businesses from Claude with MCP

Integrations5 min read
How to find local businesses from Claude with MCP: the post's first code sample

Instead of opening a map and copying names into a spreadsheet, you can ask Claude: "find florists in Bristol that have a phone number but no website". With the scrape.land MCP server connected, Claude can find local businesses itself by calling a tool named find_local_businesses, and then sort, summarise or save the results for you. This guide connects the server, shows the exact arguments Claude sends, and the data it gets back.

Connect the MCP server

scrape.land is a remote MCP server at https://scrape.land/mcp. It speaks the Streamable HTTP transport (JSON-RPC over POST), and it authenticates with your API key as a bearer token. In Claude Code, one command adds it:

shell
claude mcp add --transport http scrape-land https://scrape.land/mcp --header "Authorization: Bearer YOUR_KEY"

Clients that take a JSON config, such as Claude Desktop or Cursor, use the same URL and header:

JSON
{
  "mcpServers": {
    "scrape-land": {
      "type": "http",
      "url": "https://scrape.land/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}

The full setup, including how to test the connection, is in using scrape.land from Claude with MCP. The rest of this post is about one of its four tools.

What find_local_businesses takes

The tool runs the same search as POST /v1/places, on OpenStreetMap data. Claude fills in these arguments from your request:

Ask in plain language

With the server connected, a request like this is enough:

Find florists in Bristol, UK that have a phone number but no website. Show me the first five as a table with name, address and phone.

Claude turns it into a tool call. These are the arguments it sends:

JSON
{
  "category": "florist",
  "location": "Bristol, UK",
  "website": "no",
  "phone": "yes",
  "limit": 5
}

Most clients show the tool call and its arguments before or after it runs, so you can check that "no website" really became "website": "no".

What comes back

The tool returns the /v1/places response as JSON text, which Claude reads and reshapes. Here is the real response for the arguments above, from an account on the Free plan:

JSON
{
  "category": "florist",
  "bbox": [51.3416261, -3.1178243, 51.5444317, -2.5104192],
  "results": [
    {"name": "Belle de Jour", "category": "florist",
     "address": "29 The Mall, BS8 4JG", "city": "Bristol",
     "lat": 51.456177, "lon": -2.621862,
     "phone": "+44 117 9730445",
     "osm_url": "https://www.openstreetmap.org/way/328876534"},
    {"name": "Filton Flowers", "category": "florist",
     "address": "10 Filton Road, BS7 0PA", "city": "Bristol",
     "lat": 51.495191, "lon": -2.581568,
     "phone": "+44 7456 205520",
     "osm_url": "https://www.openstreetmap.org/way/293919430"},
    {"name": "The Rambling Rose", "category": "florist",
     "address": "226 Gloucester Road, BS7 8NZ", "city": "Bristol",
     "lat": 51.479449, "lon": -2.589716,
     "phone": "+44 117 403 9853",
     "opening_hours": "Mo,Tu,Th,Fr 09:30-17:30; We 09:30-15:00; Sa 09:30-16:30",
     "osm_url": "https://www.openstreetmap.org/way/614228932"}
  ],
  "count": 3,
  "matched": 3,
  "units": 1,
  "preview": true,
  "preview_note": "Free plan: the first 10 matches. Every paid plan returns up to 200 per call.",
  "attribution": "© OpenStreetMap contributors, ODbL (openstreetmap.org/copyright)"
}

Three florists matched, fewer than the limit of five. count is how many rows came back, matched how many fit the filters in the area; when matched is larger, ask for a higher limit. units is what the call cost. Fields a business has not listed are simply absent, so no row here has website or email. When a business lists only a Facebook, Instagram or booking page, that link comes back as profile and does not count as a website, which is usually what you want when you are looking for businesses without one.

From here, keep talking to Claude: "save these as florists.csv", "which of them are open on Wednesday afternoon?", or "do the same for Bath and merge the lists". Each new search is another tool call.

When a search is refused

The tool marks these answers as errors, so Claude sees the message and can explain it or adjust the request.

Using the results responsibly

The data comes from OpenStreetMap; keep the attribution line with it when you share or publish it. If you plan to contact these businesses, use only the public business contact details, follow the law where you and they are (in the EU that includes GDPR and the ePrivacy rules on unsolicited messages), and honour every opt-out. Our Acceptable Use Policy applies too.

What it costs

Each find_local_businesses call is billed exactly like /v1/places: 1 request unit per 10 rows returned, at least 1 per search. Lead generation is on every paid plan, with up to 200 rows per search; the Free plan (1,000 requests a month) returns a 10-row preview. See pricing.

Next steps

For the same search from code, with a CSV export, read finding local businesses without a website. The MCP tools are listed in the docs. Create a free account to get a key for Claude.

Start free with 1,000 requests Read the docs