Skip to content
MCP Server

MCP Server

The Evomi MCP Server exposes Evomi’s Public API and Scraper API over the Model Context Protocol. AI assistants like Claude can scrape and crawl websites, and manage the proxies on your account — credentials, geo targeting, sticky sessions, usage and balances — from the same conversation.

39 tools by default, 40 with EVOMI_ENABLE_SPENDING=1.


Installation Permalink to Installation

pip install evomi-mcp

Needs Python 3.10 or newer. The server runs on both major versions of the mcp SDK (>=1.8.0,<3), so it installs into an environment already pinned to mcp 1.x as well as a fresh one that resolves 2.x.

evomi-mcp --version prints the installed version and evomi-mcp --help lists the environment variables it reads. With no arguments it speaks MCP over stdio, which is how an MCP client starts it.


Configuration Permalink to Configuration

One credential is enough:

export EVOMI_PUBLIC_API_KEY="your-public-api-key"

Take it from Settings > API for a personal account, or Settings > Team for a team one. It authenticates the proxy and account tools directly. The scraping tools authenticate with the account’s scraper key, which the server reads from the Public API on the first scraping call and holds in memory for the process. That key is never written to disk and never appears in tool output.

Variable Key Used by
EVOMI_PUBLIC_API_KEY Public API key, from Settings > API Proxy credentials, usage, targeting, sessions, and indirectly everything else
EVOMI_SCRAPER_API_KEY Scraper API key, from the same page Optional. Pins a specific key for scraping, crawling, configs, schemas, storage and schedules, and skips the lookup
EVOMI_API_KEY Fallback for either of the above Both, wherever the specific variable is unset

Where a specific variable is set, it wins over EVOMI_API_KEY.

The API endpoints can be pointed elsewhere, and default to:

export EVOMI_PUBLIC_BASE_URL="https://api.evomi.com"
export EVOMI_BASE_URL="https://scrape.evomi.com"

Safety Settings Permalink to Safety Settings

Both of these change which tools exist or what they return, so decide on them when you set the server up rather than later:

Variable Effect
EVOMI_HIDE_PROXY_PASSWORDS=1 Masks every proxy password and service API key. The mask is a fixed string that carries none of the secret’s characters
EVOMI_ENABLE_SPENDING=1 Registers order_browser_profile, the one tool that spends account balance. Without it the tool is not registered at all, so the connected model never sees it

With EVOMI_HIDE_PROXY_PASSWORDS=1 set:

Tool Behaviour
get_proxy_credentials Masked. Username, gateway, ports and balance are unchanged
get_api_access Masked, even when include_api_key: true is passed explicitly
build_proxy_connection_string Refuses, naming the variable
generate_proxy_list Refuses before the API is called, so the bulk credentials are never minted
Every other tool Unchanged. None of them returns a credential

The two that refuse do so because their entire output is the credential. The refusal points at list_proxy_products and list_proxy_targeting_options, which give the gateway hostname, ports and targeting values with no credential in them.

Credentials in Tool Output Permalink to Credentials in Tool Output

get_proxy_credentials, build_proxy_connection_string and generate_proxy_list return live proxy passwords, and get_api_access returns a service API key when asked with include_api_key. Those values become part of the conversation with whatever model is connected, and part of whatever that client logs. Every other tool returns balances, endpoints, usage and targeting data only.

Three limits apply either way. The four tools above carry an instruction in their descriptions not to repeat the value back unless it was asked for directly. build_proxy_connection_string and generate_proxy_list return at most 50 entries per call, and refuse a larger request with the limit rather than clamping it. And the curl_example that comes with a connection string has its password masked, since it is the field most likely to be pasted into a terminal, a ticket or a screenshot — pass runnable_curl_example: true for the form that can be run. The connection strings themselves carry the real password either way.

API keys are read from the environment and sent as headers. They are scrubbed from tool output and error messages.


Usage with Claude Desktop Permalink to Usage with Claude Desktop

Add to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "evomi": {
      "command": "evomi-mcp",
      "env": {
        "EVOMI_PUBLIC_API_KEY": "your-public-api-key"
      }
    }
  }
}

Or if installed from source:

{
  "mcpServers": {
    "evomi": {
      "command": "python",
      "args": ["-m", "evomi_mcp.server"],
      "env": {
        "EVOMI_PUBLIC_API_KEY": "your-public-api-key"
      }
    }
  }
}

Available Tools (39 Total) Permalink to Available Tools (39 Total)

Thirty-nine tools are registered by default. order_browser_profile brings that to forty, and only when EVOMI_ENABLE_SPENDING=1 is set.

Proxy & Account (9 tools, Evomi Public API, + 1 opt-in) Permalink to Proxy & Account (9 tools, Evomi Public API, + 1 opt-in)

Tool Description Returns credentials
list_proxy_products Products on the account with endpoints, ports, balance and username No
get_proxy_credentials Proxy username and password for one product Yes
build_proxy_connection_string Connection strings with geo targeting, sessions and expert filters, plus a curl check Yes
generate_proxy_list Bulk proxy list (up to 50 per call) from the Public API generator Yes
get_proxy_usage Bandwidth used over 24h / 3d / 7d, total and per bucket No
list_proxy_targeting_options Searchable countries, regions, cities, ISPs and continents per product, each with the id the gateway accepts and its display name No
rotate_proxy_session Mutating — force a sticky session onto a new exit IP No
get_api_access Scraper and Browser access, credits, concurrency and endpoints (keys masked by default) Only on request
list_browser_profiles Saved browser fingerprint profiles No
order_browser_profile Mutating, spends money — orders a browser fingerprint profile, charged against the account’s data balance. Only registered when EVOMI_ENABLE_SPENDING=1 No

get_proxy_usage covers the four products billed by bandwidth: Premium Residential, Core Residential, Mobile and Datacenter. Static Residential is billed per rented IP instead, so list_proxy_products is where its IPs and their expiry dates are.

Scraping Operations (6 tools) Permalink to Scraping Operations (6 tools)

Tool Description
scrape_url Scrape a single URL with configurable options
crawl_website Crawl a website to discover and scrape multiple pages
map_website Discover URLs from a website
search_domains Find domains by searching the web
agent_request AI-powered conversational scraping assistant
get_task_status Check the status of an async task

Config Management (6 tools) Permalink to Config Management (6 tools)

Tool Description
list_configs List all saved scrape configurations
create_config Create a new scrape configuration
get_config Get a saved scrape configuration by ID
update_config Update an existing scrape configuration
delete_config Delete a scrape configuration
generate_config Generate a scrape config from natural language using AI

Schema Management (6 tools) Permalink to Schema Management (6 tools)

Tool Description
list_schemas List all saved extraction schemas
create_schema Create a new extraction schema
get_schema Get a saved extraction schema by ID
update_schema Update an existing extraction schema
delete_schema Delete an extraction schema
get_schema_status Get the test status of an extraction schema

Storage Management (4 tools) Permalink to Storage Management (4 tools)

Tool Description
list_storage_configs List all storage configurations
create_storage_config Create a new storage configuration
update_storage_config Update an existing storage configuration
delete_storage_config Delete a storage configuration

Schedule Management (7 tools) Permalink to Schedule Management (7 tools)

Tool Description
list_schedules List all scheduled scrape jobs
create_schedule Create a new scheduled scrape job
get_schedule Get a scheduled job by ID
update_schedule Update an existing scheduled job
delete_schedule Delete a scheduled job
toggle_schedule Toggle a scheduled job active/inactive
list_schedule_runs Get execution history for a scheduled job

Account (1 tool) Permalink to Account (1 tool)

Tool Description
get_account_info Get account information including credit balance

Tool Annotations Permalink to Tool Annotations

Every tool sets all four hints from the MCP spec — readOnlyHint, destructiveHint, idempotentHint and openWorldHint — so a client that gates on them can tell list_configs apart from delete_config. openWorldHint is true for the tools that reach an address the caller chose, and false for those that only talk to Evomi’s own endpoints. readOnlyHint is false for anything that creates, updates, deletes, toggles, rotates or orders. The MUTATING prefix on rotate_proxy_session and order_browser_profile is in the tool description as well, since a description reaches every model where an annotation only reaches a client that reads it.

A failed call comes back as a normal result with isError=True and the reason in the body, not as a transport-level error. Where the Scraper API rejected the request, that body carries the API’s own explanation of the parameter it objected to along with the status, so the next attempt can correct it.


Tool Examples Permalink to Tool Examples

Proxy Connection Strings Permalink to Proxy Connection Strings

// A US residential proxy
{"product": "rp", "countries": ["US"]}

// Berlin, sticky session held for 30 minutes, three strings
{"product": "rp", "countries": ["DE"], "city": "Berlin", "session": "sticky", "lifetime_minutes": 30, "count": 3}

// Datacenter over SOCKS5, in host:port:user:pass format
{"product": "dcp", "countries": ["GB"], "protocol": "socks5", "format": "2"}

// With a curl example that can be pasted and run as it stands
{"product": "rp", "countries": ["US"], "runnable_curl_example": true}

Call list_proxy_targeting_options first whenever a city, region or ISP is involved. Every entry it returns carries an id, which is what the gateway accepts, and a name, which is the display form. Cities, regions and continents take either — North America and north.america reach the same pool. Countries are two-letter ISO 3166-1 alpha-2 codes, so the United Kingdom is GB. An ISP is the one value that has to be the id, since the catalogue abbreviates its label.

A value the gateway does not take is refused with a pointer to what it does, rather than encoded into a string that fails at connect time. City and region targeting take at most one country, and work without one.

Scraping Permalink to Scraping

// Basic scrape
{"url": "https://example.com"}

// AI extraction
{"url": "https://example.com/products", "ai_enhance": true, "ai_prompt": "Extract product names and prices"}

// Browser mode with actions
{"url": "https://example.com", "mode": "browser", "js_instructions": [{"click": ".accept-cookies"}, {"wait": 1000}]}

Crawling Permalink to Crawling

// Basic crawl
{"domain": "example.com", "max_urls": 50}

// With URL filter
{"domain": "example.com", "url_pattern": "/products/", "depth": 3}

Domain Search Permalink to Domain Search

// Find domains
{"query": "best e-commerce sites in Germany", "max_urls": 20, "region": "de-de"}

// Up to 10 queries in one call, max_urls applying to each
{"query": ["online bookstores", "book shops UK"], "max_urls": 50}

Config Management Permalink to Config Management

// Create config
{"name": "Product Scraper", "config": {"mode": "browser", "output": "markdown"}}

// Generate config with AI
{"name": "Amazon Scraper", "prompt": "Scrape product title, price, and reviews from Amazon"}

Scheduling Permalink to Scheduling

// Create daily schedule
{"name": "Daily Prices", "config_id": "cfg_abc123", "interval_minutes": 1440, "start_time": "09:00"}

Running the Server Directly Permalink to Running the Server Directly

evomi-mcp
# or
python -m evomi_mcp.server

Credits Permalink to Credits

Scraping, crawling, schema and schedule operations consume Scraper API credits, and what a call costs depends on the mode it runs in and the options it carries. Current rates are in Pricing at a Glance.

Each scraping response carries credits_used and credits_remaining, so the cost of a call is visible in its own result. get_api_access reports the balance on the account.

The proxy tools go through the Public API and spend no Scraper API credits. Reading credentials, usage or targeting options is free, and the traffic you then send through a proxy draws on the product’s data balance, which list_proxy_products reports. order_browser_profile charges that balance directly, with no way to undo the charge, which is why it exists only under EVOMI_ENABLE_SPENDING=1.


Resources Permalink to Resources

Resource Link
GitHub Repository github.com/evomi/evomi-mcp
PyPI Package pypi.org/project/evomi-mcp
Scraper API Scraper API docs
Public API Public API docs
MCP Specification modelcontextprotocol.io