<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Neon Innovation Lab</title>
    <description>The latest articles on DEV Community by Neon Innovation Lab (@neoninnovationlab).</description>
    <link>https://dev.to/neoninnovationlab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4109619%2F05883d0b-28de-416e-a221-84e543dab6c3.PNG</url>
      <title>DEV Community: Neon Innovation Lab</title>
      <link>https://dev.to/neoninnovationlab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neoninnovationlab"/>
    <language>en</language>
    <item>
      <title>2026 MCP Gateway Benchmark: Cutting Cursor and Claude Token Bloat by 85% with Zero-Trust AST Security</title>
      <dc:creator>Neon Innovation Lab</dc:creator>
      <pubDate>Sun, 08 Nov 2026 09:40:39 +0000</pubDate>
      <link>https://dev.to/neoninnovationlab/2026-mcp-gateway-benchmark-cutting-cursor-and-claude-token-bloat-by-85-with-zero-trust-ast-ogj</link>
      <guid>https://dev.to/neoninnovationlab/2026-mcp-gateway-benchmark-cutting-cursor-and-claude-token-bloat-by-85-with-zero-trust-ast-ogj</guid>
      <description>&lt;p&gt;Connecting 3 to 5 Model Context Protocol (MCP) servers (GitHub, Postgres, Linear, Slack, Notion) into Cursor IDE or Claude Desktop hits two immediate production bottlenecks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Cursor 40-Tool Hard Limit:&lt;/strong&gt; Cursor IDE silently drops tools past index 40.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;55,000+ Token Context Bloat:&lt;/strong&gt; Verbose JSON-RPC tool schemas consume 25% to 40% of the context window before you write a single prompt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At &lt;a href="https://neoninnovationlab.com" rel="noopener noreferrer"&gt;Neon Innovation Lab&lt;/a&gt;, we benchmarked our Zero-Trust MCP Gateway (&lt;strong&gt;Neon ContextShield&lt;/strong&gt;) against the leading enterprise MCP gateways and manual configuration approaches in 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  2026 MCP Gateway Head-to-Head Benchmark
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability / Metric&lt;/th&gt;
&lt;th&gt;Neon ContextShield&lt;/th&gt;
&lt;th&gt;Lunar.dev MCPX&lt;/th&gt;
&lt;th&gt;Kong AI Gateway / Tyk&lt;/th&gt;
&lt;th&gt;TrueFoundry MCP&lt;/th&gt;
&lt;th&gt;Manual Cursor Toggling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Focus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cursor 40-tool aggregation + Token Pruning + AST Security&lt;/td&gt;
&lt;td&gt;Enterprise MCP routing &amp;amp; observability&lt;/td&gt;
&lt;td&gt;Legacy API gateway with AI plugins&lt;/td&gt;
&lt;td&gt;Cloud LLM / ML platform proxy&lt;/td&gt;
&lt;td&gt;Manual UI toggling in Cursor settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Token Context Reduction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;85% reduction&lt;/strong&gt; (55k to &amp;lt;8k tokens)&lt;/td&gt;
&lt;td&gt;~20-35% (routing focus)&lt;/td&gt;
&lt;td&gt;0% (passes full schemas)&lt;/td&gt;
&lt;td&gt;~10-25%&lt;/td&gt;
&lt;td&gt;Manual per session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor 40-Tool Bypass&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single multiplexed router (200+ tools)&lt;/td&gt;
&lt;td&gt;Multi-server aggregation&lt;/td&gt;
&lt;td&gt;Requires custom plugin&lt;/td&gt;
&lt;td&gt;Workspace-level routing&lt;/td&gt;
&lt;td&gt;Hard-capped at 40 tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proxy Overhead Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&amp;lt;3ms&lt;/strong&gt; (in-memory Rust/TS AST)&lt;/td&gt;
&lt;td&gt;8-15ms&lt;/td&gt;
&lt;td&gt;15-40ms&lt;/td&gt;
&lt;td&gt;12-30ms&lt;/td&gt;
&lt;td&gt;0ms (manual friction)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt Injection Defense&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deterministic AST + OWASP MCP Top 10&lt;/td&gt;
&lt;td&gt;Policy rules&lt;/td&gt;
&lt;td&gt;Rate-limiting &amp;amp; basic WAF&lt;/td&gt;
&lt;td&gt;RBAC &amp;amp; audit logs&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing &amp;amp; Licensing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$19/mo or $99 Lifetime&lt;/strong&gt; (Self-hosted)&lt;/td&gt;
&lt;td&gt;Enterprise custom&lt;/td&gt;
&lt;td&gt;Enterprise ($500+/mo)&lt;/td&gt;
&lt;td&gt;Usage/seat pricing&lt;/td&gt;
&lt;td&gt;Free (high dev time cost)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Full Architecture &amp;amp; Custom Engineering
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Benchmark &amp;amp; Cursor 40-Tool Solution:&lt;/strong&gt; &lt;a href="https://neoninnovationlab.com/solutions/cursor-40-tool-limit" rel="noopener noreferrer"&gt;https://neoninnovationlab.com/solutions/cursor-40-tool-limit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Trust MCP Security &amp;amp; OWASP Auditing:&lt;/strong&gt; &lt;a href="https://neoninnovationlab.com/mcp-security" rel="noopener noreferrer"&gt;https://neoninnovationlab.com/mcp-security&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom AI Agents, Automations, Web &amp;amp; Mobile App Engineering (1-4 Week Sprints):&lt;/strong&gt; &lt;a href="https://neoninnovationlab.com" rel="noopener noreferrer"&gt;https://neoninnovationlab.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact:&lt;/strong&gt; &lt;code&gt;hello@neoninnovationlab.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>cursor</category>
      <category>security</category>
    </item>
    <item>
      <title>Best Free Google Maps Scrapers in 2026 (Outscraper Alternatives Compared)</title>
      <dc:creator>Neon Innovation Lab</dc:creator>
      <pubDate>Mon, 19 Oct 2026 14:59:09 +0000</pubDate>
      <link>https://dev.to/neoninnovationlab/best-free-google-maps-scrapers-in-2026-outscraper-alternatives-compared-4l51</link>
      <guid>https://dev.to/neoninnovationlab/best-free-google-maps-scrapers-in-2026-outscraper-alternatives-compared-4l51</guid>
      <description>&lt;h1&gt;
  
  
  Best Free Google Maps Scrapers in 2026 (Outscraper Alternatives Compared)
&lt;/h1&gt;

&lt;p&gt;If you are building an outbound sales campaign, local agency prospecting list, or real estate directory, Google Maps is the most accurate, real-time database of local businesses on Earth.&lt;/p&gt;

&lt;p&gt;However, finding a reliable scraper without getting locked into expensive \$49–\$149/month SaaS subscriptions is a minefield. &lt;/p&gt;

&lt;p&gt;In this benchmark comparison, we test the top &lt;strong&gt;Google Maps scrapers and B2B lead enrichment tools in 2026&lt;/strong&gt; across pricing, email enrichment capabilities, anti-bot reliability, and free tier allowances.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scraper / Tool&lt;/th&gt;
&lt;th&gt;Free Tier&lt;/th&gt;
&lt;th&gt;Cost per 1k Leads&lt;/th&gt;
&lt;th&gt;Extracts Emails?&lt;/th&gt;
&lt;th&gt;Monthly Lock-in&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/Ansarii/free-google-maps-lead-scraper" rel="noopener noreferrer"&gt;Free Google Maps Lead Scraper&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50 leads free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$7.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Yes (from official websites)&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;$0/mo (PPE)&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Developers, SDRs, Growth Hackers&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outscraper&lt;/td&gt;
&lt;td&gt;25 leads free&lt;/td&gt;
&lt;td&gt;$15 – $30&lt;/td&gt;
&lt;td&gt;⚠️ Extra fee&lt;/td&gt;
&lt;td&gt;💸 $29 – $99/mo&lt;/td&gt;
&lt;td&gt;Enterprise batches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PhantomBuster&lt;/td&gt;
&lt;td&gt;14-day trial&lt;/td&gt;
&lt;td&gt;$40 – $80&lt;/td&gt;
&lt;td&gt;⚠️ Needs separate flow&lt;/td&gt;
&lt;td&gt;💸 $69 – $149/mo&lt;/td&gt;
&lt;td&gt;Multi-platform scrapers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ScrapingBee&lt;/td&gt;
&lt;td&gt;1,000 API calls&lt;/td&gt;
&lt;td&gt;API usage&lt;/td&gt;
&lt;td&gt;❌ Raw HTML only&lt;/td&gt;
&lt;td&gt;💸 $49 – $249/mo&lt;/td&gt;
&lt;td&gt;Raw proxy developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apollo.io&lt;/td&gt;
&lt;td&gt;50 credits/mo&lt;/td&gt;
&lt;td&gt;$150 – $300&lt;/td&gt;
&lt;td&gt;✅ Directory emails&lt;/td&gt;
&lt;td&gt;💸 $99 – $1,200/yr&lt;/td&gt;
&lt;td&gt;Tech B2B prospecting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. Free Google Maps Lead Scraper (Open-Source + Apify)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/Ansarii/free-google-maps-lead-scraper" rel="noopener noreferrer"&gt;https://github.com/Ansarii/free-google-maps-lead-scraper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Runner&lt;/strong&gt;: &lt;a href="https://apify.com/neon_innovation_lab/google-maps-b2b-lead-enricher" rel="noopener noreferrer"&gt;Apify Actor: google-maps-b2b-lead-enricher&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Pay-Per-Event (~$7.00 per 1,000 leads). &lt;strong&gt;First 50 leads are 100% free&lt;/strong&gt; under Apify's $5/mo free credit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why it stands out:
&lt;/h3&gt;

&lt;p&gt;Most scrapers stop once they pull Google Maps data. This open-source tool runs a 2-stage enrichment pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It queries Google Maps with residential proxy rotation to bypass consent screens.&lt;/li&gt;
&lt;li&gt;It immediately visits each business's official website using high-speed Cheerio parsing to scrape &lt;strong&gt;contact emails, secondary phone numbers, and social media links (LinkedIn, Facebook, Instagram)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You can run it via Python CLI, Node.js, or 1-click cloud execution.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Outscraper
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Pay-as-you-go, but with base plans starting around $29/mo to $99/mo for meaningful volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Around $15 to $30 per 1,000 enriched leads.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Established platform with clean UI.&lt;/li&gt;
&lt;li&gt;Supports bulk Google Maps reviews and historical data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Expensive overage costs for contact email enrichment.&lt;/li&gt;
&lt;li&gt;Minimum credit purchase requirements.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. PhantomBuster
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: $69/mo to $149/mo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: PhantomBuster bills by execution time (hours) rather than extracted results. Because Google Maps renders dynamic JavaScript, scraping runs consume execution minutes rapidly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Broad suite of scrapers (LinkedIn, Instagram, Google).&lt;/li&gt;
&lt;li&gt;Native CRM connectors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;High recurring monthly subscription cost.&lt;/li&gt;
&lt;li&gt;Extracting emails requires chaining multiple "Phantoms" together, increasing latency and failure rates.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Apollo.io / ZoomInfo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: $99 to $1,000+/month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: $0.15 to $0.50 per verified email credit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Massive corporate decision-maker database (CEOs, VPs).&lt;/li&gt;
&lt;li&gt;Built-in cold email sequencer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not optimized for local SMBs (plumbers, roofers, dentists, salons, boutiques often have outdated data in Apollo).&lt;/li&gt;
&lt;li&gt;Highly restrictive export limits on lower-tier plans.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion: Which Tool Should You Choose?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you need &lt;strong&gt;corporate enterprise contacts&lt;/strong&gt; (SaaS founders, VP of Sales), use &lt;strong&gt;Apollo&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If you need &lt;strong&gt;massive local SMB leads with verified contact emails and phone numbers&lt;/strong&gt; without paying a monthly subscription, use the &lt;strong&gt;&lt;a href="https://github.com/Ansarii/free-google-maps-lead-scraper" rel="noopener noreferrer"&gt;Free Google Maps Lead Scraper&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get 50 leads free right out of the box, and additional leads cost just &lt;strong&gt;~$0.007 each&lt;/strong&gt; with zero monthly lock-in.&lt;/p&gt;

&lt;p&gt;👉 Check out the open-source repository on GitHub: &lt;a href="https://github.com/Ansarii/free-google-maps-lead-scraper" rel="noopener noreferrer"&gt;https://github.com/Ansarii/free-google-maps-lead-scraper&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Scrape Google Maps Leads with Emails for Free (Python &amp; Node.js)</title>
      <dc:creator>Neon Innovation Lab</dc:creator>
      <pubDate>Mon, 19 Oct 2026 14:58:13 +0000</pubDate>
      <link>https://dev.to/neoninnovationlab/how-to-scrape-google-maps-leads-with-emails-for-free-python-nodejs-3ae3</link>
      <guid>https://dev.to/neoninnovationlab/how-to-scrape-google-maps-leads-with-emails-for-free-python-nodejs-3ae3</guid>
      <description>&lt;h1&gt;
  
  
  How to Scrape Google Maps Leads with Emails for Free (Python &amp;amp; Node.js)
&lt;/h1&gt;

&lt;p&gt;If you've ever tried scraping Google Maps for local B2B leads, you know the major roadblock: &lt;strong&gt;Google Maps never shows email addresses.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Google Maps listings give you business names, phone numbers, star ratings, and website links, but if you want to run cold email outreach or build a prospecting list, raw maps data leaves you stuck manually clicking through hundreds of websites to find contact inboxes.&lt;/p&gt;

&lt;p&gt;In this guide, you will learn how to build an automated, zero-cost pipeline that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Searches Google Maps&lt;/strong&gt; for any target niche and location (e.g., &lt;em&gt;"Roofers in Austin, TX"&lt;/em&gt;, &lt;em&gt;"Dentists in Miami, FL"&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extracts verified business details&lt;/strong&gt;: Name, address, phone number, star rating, and website.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep-crawls each company's website&lt;/strong&gt; to extract syntax-verified contact emails and social media profiles (LinkedIn, Instagram, Facebook).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exports cleanly to CSV and JSON&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Best of all, you can run this &lt;strong&gt;completely free for your first 50 leads&lt;/strong&gt; without needing a credit card or maintaining expensive residential proxy infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture: Why Most Scrapers Fail
&lt;/h2&gt;

&lt;p&gt;Traditional Google Maps scrapers just pull the visible DOM on Google Maps. That gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business Name: ✅&lt;/li&gt;
&lt;li&gt;Phone Number: ✅&lt;/li&gt;
&lt;li&gt;Physical Address: ✅&lt;/li&gt;
&lt;li&gt;Website: ✅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contact Email: ❌ (NOT stored on Google Maps)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To solve this, our pipeline deploys a &lt;strong&gt;2-Stage Lead Enrichment Architecture&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────┐      ┌────────────────────────┐      ┌────────────────────────┐
│  Stage 1: Google Maps  │ ───► │ Stage 2: Deep Website  │ ───► │  Stage 3: Data Export  │
│  Extract Listings &amp;amp;    │      │ Visit company site to  │      │ Clean CSV &amp;amp; JSON with  │
│  Official Website URLs │      │ scrape emails &amp;amp; socials│      │ verified B2B contacts  │
└────────────────────────┘      └────────────────────────┘      └────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rather than managing headless browsers, anti-bot bypasses, and proxy pools yourself, we wrap this pipeline into an open-source client calling the cloud Actor &lt;a href="https://apify.com/neon_innovation_lab/google-maps-b2b-lead-enricher" rel="noopener noreferrer"&gt;&lt;code&gt;neon_innovation_lab/google-maps-b2b-lead-enricher&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Python 3.8+ or Node.js 18+&lt;/li&gt;
&lt;li&gt;A free Apify API token (Apify provides &lt;strong&gt;$5.00/month in free credits&lt;/strong&gt;, and the first 50 leads incur &lt;strong&gt;$0 in custom event fees&lt;/strong&gt;).

&lt;ul&gt;
&lt;li&gt;Sign up free: &lt;a href="https://console.apify.com/" rel="noopener noreferrer"&gt;https://console.apify.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Copy your token from: &lt;a href="https://console.apify.com/account/integrations" rel="noopener noreferrer"&gt;https://console.apify.com/account/integrations&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Method 1: Python Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install the SDK
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;apify-client python-dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The Python Script (&lt;code&gt;scrape_leads.py&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Initialize client with your free API token
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN_HERE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Define search parameters
&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchQueries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Roofers in Austin, TX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResultsPerQuery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;# First 50 leads are 100% free!
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;extractEmailsAndSocials&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Deep website visit for emails &amp;amp; socials
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;countryCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🚀 Starting Google Maps Lead Extraction with Email Enrichment...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;neon_innovation_lab/google-maps-b2b-lead-enricher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Retrieve dataset items
&lt;/span&gt;&lt;span class="n"&gt;dataset_items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🎉 Successfully scraped &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset_items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; enriched leads!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Export to CSV
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;leads.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Phone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Website&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Emails&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Address&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lead&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataset_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;emails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lead&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;emails&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="n"&gt;lead&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;lead&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;lead&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;phone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;lead&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;lead&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;lead&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;address&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;💾 Saved to leads.csv!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_token_here"&lt;/span&gt;
python scrape_leads.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Method 2: Node.js Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install the SDK
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;apify-client dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The Node.js Script (&lt;code&gt;scrape_leads.js&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ApifyClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apify-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APIFY_TOKEN&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_APIFY_TOKEN_HERE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;runInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;searchQueries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dentists in Miami, FL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;maxResultsPerQuery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// First 50 leads are free!&lt;/span&gt;
  &lt;span class="na"&gt;extractEmailsAndSocials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Collect emails &amp;amp; social profiles&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;us&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🚀 Running lead extraction...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;neon_innovation_lab/google-maps-b2b-lead-enricher&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;runInput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;listItems&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`✅ Extracted &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; enriched businesses!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Export to JSON&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;leads.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;💾 Saved to leads.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Sample Extracted Output
&lt;/h2&gt;

&lt;p&gt;Here is an example of what the returned JSON dataset looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Austin Premier Roofing Co"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Roofing contractor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1204 E 7th St, Austin, TX 78702"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(512) 555-0142"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.austinpremierroofing.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"contact@austinpremierroofing.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"estimates@austinpremierroofing.com"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"socials"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"linkedin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.linkedin.com/company/austin-premier-roofing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"facebook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.facebook.com/austinpremierroofing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"instagram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.instagram.com/austinroofingtx"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rating"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reviewsCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;184&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"googleMapsUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.google.com/maps/place/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Roofers in Austin, TX"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scrapedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-19T12:00:00.000Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Cost Comparison: Why Pay-Per-Event Wins
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Monthly Subscription&lt;/th&gt;
&lt;th&gt;Cost for 1,000 Leads&lt;/th&gt;
&lt;th&gt;Free Trial&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;This Tool (&lt;code&gt;free-google-maps-lead-scraper&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0 / month&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$7.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🎁 &lt;strong&gt;First 50 Leads Free&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outscraper&lt;/td&gt;
&lt;td&gt;$29 – $99 / mo&lt;/td&gt;
&lt;td&gt;$15 – $30&lt;/td&gt;
&lt;td&gt;25 leads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PhantomBuster&lt;/td&gt;
&lt;td&gt;$69 – $149 / mo&lt;/td&gt;
&lt;td&gt;$40 – $80&lt;/td&gt;
&lt;td&gt;14-day limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apollo / ZoomInfo&lt;/td&gt;
&lt;td&gt;$99 – $1,000+ / mo&lt;/td&gt;
&lt;td&gt;$150 – $300&lt;/td&gt;
&lt;td&gt;Limited export&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By leveraging Apify's Pay-Per-Event (PPE) model, you only pay for what you actually extract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;First 50 leads&lt;/strong&gt;: $0.00 custom fee&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional leads&lt;/strong&gt;: $0.005 per enriched lead + $0.002 dataset storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total effective cost&lt;/strong&gt;: ~$7.03 per 1,000 verified leads!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Open-Source GitHub Repository
&lt;/h2&gt;

&lt;p&gt;The complete open-source code with CLI options (&lt;code&gt;--query&lt;/code&gt;, &lt;code&gt;--limit&lt;/code&gt;, &lt;code&gt;--country&lt;/code&gt;), automated CSV/JSON formatting, and sample data is available on GitHub:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/Ansarii/free-google-maps-lead-scraper" rel="noopener noreferrer"&gt;GitHub: Ansarii/free-google-maps-lead-scraper&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you don't even want to run local code, you can trigger the scraper directly in your browser with 1 click:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://apify.com/neon_innovation_lab/google-maps-b2b-lead-enricher" rel="noopener noreferrer"&gt;Run on Apify Store: google-maps-b2b-lead-enricher&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy prospecting! If you found this useful, don't forget to star the GitHub repo! ⭐&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Show HN: We scanned 23 public MCP servers for CVEs - Here is what broke</title>
      <dc:creator>Neon Innovation Lab</dc:creator>
      <pubDate>Fri, 04 Sep 2026 11:21:33 +0000</pubDate>
      <link>https://dev.to/neoninnovationlab/show-hn-we-scanned-23-public-mcp-servers-for-cves-here-is-what-broke-f1l</link>
      <guid>https://dev.to/neoninnovationlab/show-hn-we-scanned-23-public-mcp-servers-for-cves-here-is-what-broke-f1l</guid>
      <description>&lt;p&gt;With tens of thousands of Model Context Protocol (MCP) servers published in 2026, AI agents now have direct execution bridges to local terminals, filesystems, and production databases.&lt;/p&gt;

&lt;p&gt;Following 30+ CVE disclosures against MCP tools in early 2026 alone (including CVSS 9.4+ RCEs), verifying the security of MCP servers before plugging them into Claude Desktop, Cursor, or autonomous agent runtimes has become critical.&lt;/p&gt;

&lt;p&gt;However, existing scanning approaches suffer from two fatal flaws:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Active RCE on the Scanning Machine:&lt;/strong&gt; Several popular scanners attempt to execute &lt;code&gt;stdio&lt;/code&gt; commands directly from target configuration files to retrieve tool descriptions. If you scan an untrusted third-party server, you are executing arbitrary remote code on your own machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;False-Positive Floods:&lt;/strong&gt; Naive YARA or regex scanners trigger up to ~78% false-positive rates by flagging mock keys and test fixtures inside &lt;code&gt;test/&lt;/code&gt; folders.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To see what real-world security looks like, we built a zero-execution AST static auditor and benchmarked &lt;strong&gt;23 prominent reference and community MCP servers&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Here is what we found.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Audit Benchmark (23 Repositories)
&lt;/h2&gt;

&lt;p&gt;We evaluated 23 MCP implementations across three tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic Official Reference Servers&lt;/strong&gt; (&lt;code&gt;modelcontextprotocol/servers&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archived Reference Servers&lt;/strong&gt; (&lt;code&gt;modelcontextprotocol/servers-archived&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Popular Community Implementations&lt;/strong&gt; (&lt;code&gt;fastmcp&lt;/code&gt;, &lt;code&gt;slack-mcp-server&lt;/code&gt;, &lt;code&gt;brave-search-mcp&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Executive Benchmark Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Target MCP Server&lt;/th&gt;
&lt;th&gt;Files Scanned&lt;/th&gt;
&lt;th&gt;Trust Score&lt;/th&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Flaws Found&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1–7&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Anthropic Core Reference&lt;/strong&gt; (&lt;code&gt;filesystem&lt;/code&gt;, &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;memory&lt;/code&gt;, &lt;code&gt;sequentialthinking&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;~60&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Anthropic Reference&lt;/strong&gt; (&lt;code&gt;everything&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;&lt;code&gt;85/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 (Unauthenticated SSE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9–20&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Archived Reference Servers&lt;/strong&gt; (&lt;code&gt;sqlite&lt;/code&gt;, &lt;code&gt;postgres&lt;/code&gt;, &lt;code&gt;slack&lt;/code&gt;, &lt;code&gt;puppeteer&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt;, &lt;code&gt;gitlab&lt;/code&gt;, &lt;code&gt;redis&lt;/code&gt;, &lt;code&gt;sentry&lt;/code&gt;, &lt;code&gt;gdrive&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;~60&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FastMCP (Community)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;491&lt;/td&gt;
&lt;td&gt;&lt;code&gt;25/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;F&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4 (ZipSlip, 0.0.0.0 SSE, Unconstrained file tools)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Slack MCP Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Brave Search MCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What Actually Broke?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. ZipSlip Archive Extraction (CWE-22)
&lt;/h3&gt;

&lt;p&gt;In community telemetry handling, archive extraction was performed using &lt;code&gt;tarfile.extractall()&lt;/code&gt; without safe directory containment or filter flags. In Python environments, unvalidated archive members can write arbitrary files outside the destination directory when unpacked.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Always specify &lt;code&gt;filter='data'&lt;/code&gt; in Python 3.12+ or sanitize archive member paths before extracting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Unauthenticated Remote SSE Transports on &lt;code&gt;0.0.0.0&lt;/code&gt; (CWE-306)
&lt;/h3&gt;

&lt;p&gt;Multiple example scripts and server entrypoints bound Server-Sent Events (SSE) transports directly to &lt;code&gt;0.0.0.0&lt;/code&gt; with no authentication middleware or Bearer token checks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Danger:&lt;/strong&gt; Any client on the local network or public internet can discover the endpoint and execute MCP tool definitions without credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Default transport bindings strictly to &lt;code&gt;127.0.0.1&lt;/code&gt; for local usage, and require Bearer token or OAuth authentication headers whenever binding to &lt;code&gt;0.0.0.0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Missing Root Path Boundary Containment in File Tools (CWE-22)
&lt;/h3&gt;

&lt;p&gt;We observed tools with functions named &lt;code&gt;read_file&lt;/code&gt; or &lt;code&gt;search_files&lt;/code&gt; that accept dynamic file path parameters from LLMs and pass them directly to &lt;code&gt;open()&lt;/code&gt; without checking if the target path resides within an allowed root.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Danger:&lt;/strong&gt; An LLM encountering a prompt injection or untrusted input can easily traverse up directories (&lt;code&gt;../../etc/passwd&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Always enforce root boundary checks:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ALLOWED_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;user_path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_relative_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ALLOWED_ROOT&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Path traversal attempt detected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Takeaways for Developers Building MCP Servers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Treat tool descriptions as untrusted context:&lt;/strong&gt; Do not include hidden prompt overrides or unescaped user inputs in tool metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never invoke dynamic shells:&lt;/strong&gt; Avoid &lt;code&gt;subprocess.run(shell=True)&lt;/code&gt; and &lt;code&gt;child_process.exec()&lt;/code&gt;. Always pass arguments as explicit string arrays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter test fixtures from automated scanning:&lt;/strong&gt; If you run security audits in CI/CD, exclude test mock directories to eliminate 90%+ of false-positive noise.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Run an Audit on Your MCP Servers
&lt;/h2&gt;

&lt;p&gt;If you maintain an MCP server or use them in production, you can test your repository for these exact vulnerabilities without running untrusted code on your machine:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://apify.com/neon_innovation_lab/mcp-security-auditor" rel="noopener noreferrer"&gt;MCP Security &amp;amp; Vulnerability Auditor on Apify Store&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop in your public GitHub repository URL, and it generates a complete Trust Score (0–100) and actionable remediation report.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
    </item>
  </channel>
</rss>
