Official MCP server for Outscraper.
It exposes production-ready MCP tools for:
- business discovery and enrichment
- Google Maps places, reviews, photos, and chain detection
- company insights, emails, email validation, and phone enrichment
- Google Search and Google Images search
- Yellow Pages, Booking, Yelp, Tripadvisor, Trustpilot, and Indeed data
- account balance checks and async request lifecycle management
The server supports stdio and HTTP transports, npm-based installation, hosted header or URL auth, and a normalized structuredContent result shape for MCP clients and agents.
This MCP server exposes Outscraper data sources and enrichment workflows to MCP-compatible clients.
It is designed for:
- business and place discovery
- Google Maps review and photo retrieval
- contact and company enrichment
- AI-assisted structured extraction from a single page with
ai_scraper - async request submission and polling through
requests_get
In practice, the server acts as a thin MCP layer over the Outscraper API:
- MCP clients call tools on this server
- the server authenticates with an Outscraper API key
- requests are forwarded to Outscraper endpoints
- results are returned in a normalized MCP tool envelope
set OUTSCRAPER_API_KEY=YOUR_API_KEY
npx -y outscraper-mcpFor MCP clients, configure:
- command:
npx - args:
["-y", "outscraper-mcp"] - env:
OUTSCRAPER_API_KEY=YOUR_API_KEY
For task-oriented workflows, copy-paste examples, and example agent skills, see the examples folder.
businesses_searchbusinesses_getai_scrapergoogle_maps_searchgoogle_maps_reviewscompany_insightsemails_and_contactsemails_validatorgoogle_maps_photoschain_infoyellowpages_searchbooking_reviewsphones_enrichertp_datatp_reviewsyelp_reviewstripadvisor_searchtripadvisor_reviewsgoogle_searchgoogle_search_imagesindeed_searchbalance_getrequests_getrequests_listrequests_delete
These tools are aligned to the current documented Outscraper API shapes, including:
POST /businessesPOST /ai-scraperGET /businesses/{business_id}GET /google-maps-searchGET /google-maps-photosGET /google-searchGET /google-search-imagesGET /yellowpages-searchGET /booking-reviewsGET /phones-enricherGET /trustpilotGET /trustpilot-reviewsGET /yelp-reviewsGET /tripadvisor-searchGET /tripadvisor-reviewsGET /indeed-searchGET /google-maps-reviewsGET /company-insightsGET /emails-and-contactsGET /email-validator- documented
ai_chain_infoenrichment viagoogle-maps-search GET /profile/balanceGET /requests/{requestId}DELETE /requests/{requestId}GET /requests
Every tool now returns the same structured envelope:
{
"data": {},
"meta": {
"service": "company_insights",
"operation": "get"
},
"async": {
"id": "request-id",
"status": "Pending",
"results_location": "https://api.outscraper.com/requests/request-id",
"is_async_submission": true,
"next_step": "Call requests_get with request_id=\"request-id\" to check progress."
}
}async is present when the response is an async submission or exposes async request metadata.
Async-capable tools now accept:
{
"execution_mode": "auto"
}Available values:
auto: let the MCP server choose sync or asyncsync: force direct response modeasync: force async submission mode
The old boolean async is still accepted for compatibility, but execution_mode now has priority.
The recommended way to use this MCP server is from npm.
npx -y outscraper-mcpProvide OUTSCRAPER_API_KEY through your MCP client config or shell environment.
The server auto-loads .env on startup via dotenv.
On Windows, if a client cannot find npx, use the full Node.js path instead, for example:
{
"command": "C:\\Program Files\\nodejs\\npx.cmd",
"args": ["-y", "outscraper-mcp"]
}The server currently supports these connection patterns:
Best for:
- Claude Desktop
- Claude Code
- Cursor
- VS Code
- Windsurf
- local MCP development
Auth source:
OUTSCRAPER_API_KEYenvironment variable
Transport:
- local process over stdio
Best for:
- hosted MCP endpoints
- n8n
- reverse proxy or domain-based deployment
- containerized remote usage
Auth source when CLOUD_SERVICE=true:
X-OUTSCRAPER-API-KEYX-API-KEYAuthorization: Bearer <api-key>/v1/mcp/<api-key>path auth
Transport:
- HTTP
POST /mcp - HTTP
POST /v1/mcp/<api-key>
Best for:
- session-based MCP usage
- clients that rely on stateful HTTP transport semantics
Auth source when CLOUD_SERVICE=true:
- the same header or URL-based auth options as stateless HTTP
Transport:
POST /mcpGET /mcpDELETE /mcp- and the same
/v1/mcp/<api-key>route pattern
Note:
- stateful mode stores sessions in process memory, so it is better suited to a single instance or sticky-session deployment than horizontal scaling
If you want to connect this server to ChatGPT as a remote MCP connector, the simplest hosted form is:
https://your-domain.example/v1/mcp/YOUR_API_KEY
Recommended setup:
- Deploy the server over HTTPS behind a real domain or reverse proxy.
- Enable hosted mode with
CLOUD_SERVICE=true. - Use the URL-auth route if the connector cannot attach custom auth headers.
- Prefer header auth for server-to-server clients when custom headers are available.
Typical connector values:
- Name:
Outscraper MCP - Description:
Business discovery, Google Maps data, enrichment, search, and AI scraping - MCP Server URL:
https://your-domain.example/v1/mcp/YOUR_API_KEY - Authentication:
None
Notes:
- URL-auth is the most convenient option for connector-style setup, but it is less private than header auth because URLs are more likely to appear in logs.
- Avoid temporary tunnels that inject browser warning pages unless your connector can bypass them cleanly.
If you want hosted behavior, enable:
set CLOUD_SERVICE=trueThen the HTTP caller can send the Outscraper API key in one of these headers:
Authorization: Bearer <api-key>X-API-KEY: <api-key>X-OUTSCRAPER-API-KEY: <api-key>
In CLOUD_SERVICE=true HTTP mode, request headers are used as the API key source. In local stdio mode, OUTSCRAPER_API_KEY is still required.
HTTP requests without one of these auth forms are rejected before MCP processing begins.
For ChatGPT-style connectors or other hosted setups that cannot send custom headers, you can also pass the API key in the path:
http://localhost:3000/v1/mcp/YOUR_API_KEY
This route supports the same MCP behavior as /mcp, but authenticates from the URL path when CLOUD_SERVICE=true.
For server-to-server integrations, header auth is still preferred because URL-based API keys are more likely to appear in logs.
set HTTP_STREAMABLE_SERVER=true
set HOST=localhost
set PORT=3000
npx -y outscraper-mcpMCP endpoint:
http://localhost:3000/mcp
Hosted URL auth endpoint:
http://localhost:3000/v1/mcp/YOUR_API_KEY
Health endpoint:
http://localhost:3000/health
This repository also includes a docker-compose.yml for hosted/container deployments:
docker compose up --build -dDefault container behavior:
- binds
3000:3000 - enables
CLOUD_SERVICE=true - enables stateless Streamable HTTP
- listens on
0.0.0.0 - uses
https://api.outscraper.comas the upstream API base URL
Endpoints:
http://localhost:3000/mcp
http://localhost:3000/v1/mcp/YOUR_API_KEY
http://localhost:3000/health
Important notes for Docker usage:
- this compose file is intended for hosted remote access, not local stdio clients
- by default it expects callers to authenticate per request, not through a single server-wide API key
- if you put the service behind a domain or reverse proxy, prefer header auth for server-to-server usage
- URL auth is available mainly for connector flows that cannot attach custom headers
This mode uses local session management:
set SSE_LOCAL=true
set HOST=localhost
set PORT=3000
npx -y outscraper-mcpYou can also enable the same mode with:
set HTTP_STATEFUL_SERVER=true
set HOST=localhost
set PORT=3000
npx -y outscraper-mcpIn this mode the server accepts:
POST /mcpfor initialize and subsequent requestsGET /mcpfor the session streamDELETE /mcpfor session termination
The session is tracked through the mcp-session-id header.
Hosted URL auth also works in stateful mode through:
http://localhost:3000/v1/mcp/YOUR_API_KEY
Claude Desktop
Add this to your Claude Desktop MCP config:
{
"mcpServers": {
"outscraper": {
"command": "npx",
"args": ["-y", "outscraper-mcp"],
"env": {
"OUTSCRAPER_API_KEY": "YOUR_API_KEY"
}
}
}
}Claude Code
Add the server with the Claude Code CLI:
claude mcp add outscraper -e OUTSCRAPER_API_KEY=YOUR_API_KEY -- npx -y outscraper-mcpCursor
Add this to your global MCP configuration:
{
"mcpServers": {
"outscraper": {
"command": "npx",
"args": ["-y", "outscraper-mcp"],
"env": {
"OUTSCRAPER_API_KEY": "YOUR_API_KEY"
}
}
}
}Windsurf
Add this to your MCP config:
{
"mcpServers": {
"outscraper": {
"command": "npx",
"args": ["-y", "outscraper-mcp"],
"env": {
"OUTSCRAPER_API_KEY": "YOUR_API_KEY"
}
}
}
}VS Code
For settings.json:
{
"mcp": {
"inputs": [
{
"type": "promptString",
"id": "outscraperApiKey",
"description": "Outscraper API Key",
"password": true
}
],
"servers": {
"outscraper": {
"command": "npx",
"args": ["-y", "outscraper-mcp"],
"env": {
"OUTSCRAPER_API_KEY": "${input:outscraperApiKey}"
}
}
}
}
}Cline / Roo Code / other command-based MCP clients
Use the standard stdio command form:
{
"mcpServers": {
"outscraper": {
"command": "npx",
"args": ["-y", "outscraper-mcp"],
"env": {
"OUTSCRAPER_API_KEY": "YOUR_API_KEY"
}
}
}
}n8n
For n8n or other HTTP MCP clients, run the server in Streamable HTTP mode:
set HTTP_STREAMABLE_SERVER=true
set HOST=localhost
set PORT=3000
set OUTSCRAPER_API_KEY=YOUR_API_KEY
npx -y outscraper-mcpThen use:
http://localhost:3000/mcp
{
"filters": {
"country_code": "US",
"states": ["NY"],
"cities": ["New York"],
"types": ["restaurant", "cafe"]
},
"fields": ["name", "phone", "website", "address", "rating", "reviews"],
"limit": 25
}Natural-language query support on /businesses currently depends on Outscraper's own parser behavior. In live testing, structured filters were reliable while free-form query values often returned Could not parse query into a valid request format.
{
"query": "https://outscraper.com",
"prompt": "Extract company name, company description, and people mentioned on the page.",
"schema": {
"type": "object",
"required": [],
"properties": {
"company_name": { "type": "string" },
"company_description": { "type": "string" },
"people": {
"type": "array",
"items": { "type": "string" }
}
}
},
"execution_mode": "sync"
}Use execution_mode: "async" if you want a request id and plan to poll later with requests_get.
{
"business_id": "YOUR_BUSINESS_ID",
"fields": ["name", "phone", "website", "address", "rating", "reviews"]
}{
"query": ["restaurants brooklyn usa"],
"limit": 20,
"language": "en",
"region": "us"
}{
"query": ["ChIJrc9T9fpYwokRdvjYRHT8nI4"],
"reviews_limit": 20,
"sort": "newest",
"language": "en"
}{
"query": ["outscraper.com"],
"fields": ["name", "description", "industry"],
"execution_mode": "async"
}{
"query": ["outscraper.com"],
"preferred_contacts": ["technical", "decision makers"],
"execution_mode": "sync"
}{
"query": ["[email protected]"],
"execution_mode": "sync"
}{
"query": ["NoMad Restaurant, NY, USA"],
"photos_limit": 5,
"limit": 1,
"execution_mode": "sync"
}{
"query": ["Starbucks, New York, NY, USA"],
"limit": 1,
"execution_mode": "sync"
}{
"query": ["outscraper.com"],
"execution_mode": "sync"
}{
"query": ["outscraper"],
"pages_per_query": 1,
"execution_mode": "sync"
}{
"query": ["outscraper"],
"limit": 5,
"execution_mode": "sync"
}{
"query": ["https://www.indeed.com/jobs?q=software+engineer&l=New+York%2C+NY"],
"limit": 10,
"execution_mode": "sync"
}{}{
"request_id": "YOUR_REQUEST_ID"
}businesses_searchworks reliably with structuredfilters, but free-formqueryvalues on/businessesmay fail withCould not parse query into a valid request format.This behavior was reproduced against the live API, not only inside the MCP layer.ai_scraperworks best throughPOSTwith a JSON body. In live validation,POSTacceptedpromptandschemareliably, whileGETvariants aroundschemaandquery_schemadid not match the same behavior consistently.- When Outscraper OpenAPI examples and live API behavior differ, live endpoint behavior should be treated as the source of truth.
businesses_searchis intentionally exposed here as a synchronous MCP tool because the current/businessesOpenAPI shape is request-body-based and did not prove to be a stable async-style workflow during live validation.execution_mode="auto"is heuristic-driven. It is designed to choose a practical default, but callers that need deterministic behavior should explicitly usesyncorasync.- HTTP hosted mode requires correct auth headers when
CLOUD_SERVICE=true; stdio mode still expectsOUTSCRAPER_API_KEYin the process environment. chain_infois implemented from the documentedai_chain_infoenrichment ongoogle-maps-search, because Outscraper currently does not describe a standalonechain infoendpoint.builtwithis not currently exposed as a tool because Outscraper currently does not document a dedicated BuiltWith endpoint.
- Use
businesses_searchfor structured business discovery with filters and cursor pagination. - Use
businesses_getonce you already have a concrete business id. - Use
google_maps_searchfor Google Maps-style place discovery from human search queries. - Use
google_maps_reviewswhen the user specifically needs review data rather than place discovery. - Use
company_insightsfor firmographics and company profile enrichment. - Use
emails_and_contactsfor contact discovery from known domains. - Use
requests_get,requests_list, andrequests_deleteonly for async lifecycle management. - Use
balance_getfor account and billing checks, not business data retrieval.
- The server supports stdio, stateless Streamable HTTP, and stateful local HTTP/SSE mode.
CLOUD_SERVICE=trueenables header-based API key resolution for HTTP requests.- For npm publication, package contents are intentionally limited to runtime artifacts and docs.
- Client-specific config snippets in this README are meant as practical templates; the exact settings UI and config key names may vary slightly between MCP clients and versions.