An MCP (Model Context Protocol) server with two tools. You ask in plain language; the server
queries Google Places API (New), paginates, deduplicates by placeId and returns only the businesses
whose websiteUri is empty.
“Find dental clinics without a website in Temuco, Chile and save them to a CSV.”
| Tool | What it does |
|---|---|
find_businesses_without_website | city (required), niche, country, limit 1–60, page size 1–20, up to 3 pages, language. Returns name, address, phone, rating, Maps link. |
export_leads_csv | Writes the same rows to a CSV file with a UTF-8 BOM so Excel opens the accents correctly. |
pip install, no Node, no build step.mcp SDK as client, and a Docker test that starts the container and speaks JSON-RPC to it.{
"mcpServers": {
"local-leads": {
"command": "python3",
"args": ["/ABSOLUTE/PATH/TO/server.py"],
"env": { "GOOGLE_PLACES_API_KEY": "YOUR_KEY_HERE" }
}
}
}
Save server.py anywhere, get a Google Places API (New) key with billing enabled,
paste the block in your client config and restart. For Claude Code or any stdio client:
GOOGLE_PLACES_API_KEY=your_key python3 server.py.
docker build -t mcp-local-leads .
docker run -i --rm -e GOOGLE_PLACES_API_KEY=your_key mcp-local-leads
-i keeps stdin open and there is no -t: an MCP stdio server speaks
one JSON line per message and a pseudo-TTY would corrupt it.
Without a key the tool returns an error naming GOOGLE_PLACES_API_KEY instead of
crashing — that case is one of the tests, because it is the first state a new user hits.
Source, tests and CI: github.com/ellokillox/mcp-local-leads (MIT).
The server that does the pipeline — scoring, enrichment, CRM sync — ships with the B2B Revenue Autopilot Kit. This one only finds; that one decides who is worth writing to.