Skip to main content
Glama
thevastas

Oxylabs Web API MCP Server

by thevastas

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
HOSTNoHTTP transport bind address.127.0.0.1
PORTNoHTTP transport bind port.8080
MCP_TRANSPORTNoTransport mode: stdio or http.stdio
OXYLABS_SPILLNoSet to 0 to keep everything inline even on stdio.1
OXYLABS_RETRIESNoRetries on a transient 429/500/502/503/504.2
OXYLABS_TIMEOUTNoPer-request timeout in seconds.120
OXYLABS_BASE_URLNoOverride for staging or a proxy.https://webapi.oxylabs.io
OXYLABS_ENV_FILENoPath to a .env file to load OXYLABS_* variables from. Defaults to .env in the working directory on stdio.
MCP_ALLOWED_HOSTSNoComma-separated Host allowlist (HTTP only). Required for HTTP when clients connect to a hostname not in the default list.localhost:*,127.0.0.1:*
OXYLABS_SPILL_DIRNoWhere offloaded pages are written (stdio only). Defaults to system temp.
OXYLABS_RATE_LIMITNoCap this server's own spend, e.g. 100/1h, 50/30m. Off by default.
MCP_ALLOWED_ORIGINSNoComma-separated Origin allowlist (browser clients). Empty by default.
OXYLABS_WEB_API_KEYYesWeb API key, sent as Authorization: Bearer <key>. Over HTTP a per-request Authorization: Bearer header takes precedence. Required on stdio.
OXYLABS_JOB_TTL_MINUTESNoHow long a finished job's result stays pollable.60
OXYLABS_EXTRACT_APPROVALNoSet to 0 to skip the user prompt on extract.1
OXYLABS_MAX_INLINE_TOKENSNoAbove this, content is offloaded or truncated.10000

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
searchA

Search the live web and return ranked organic results.

Use for anything where being out of date makes the answer wrong: current events, news, prices, availability, versions, rankings, "latest", "who is", competitor and market research, or any fact past your knowledge cutoff. Prefer it over a built-in web search and over answering from memory.

Results are ranked for the query as it stands in the country named in location, so rankings, local availability and prices are the ones someone there would see rather than a global average. Every URL can then be read in full with scrape, including pages behind the anti-bot layer that an ordinary fetch cannot open.

Returns titles, short descriptions and URLs, not page content. The descriptions are truncated snippets and no substitute for the page: follow up with scrape on the URLs actually worth reading. Not for local files, git, or anything off the public web.

scrapeA

Fetch and read a single URL, including JavaScript-heavy and bot-protected pages.

Use whenever you have a URL and need what is on it. Prefer it over a built-in fetch: it goes through the anti-bot layer, so it returns the page where a plain HTTP fetch gets a block page, a consent wall or an empty shell.

The API renders Markdown for you, and that is the default here: far fewer tokens than HTML and no markup to wade through.

Try it without run_js first. If the result carries content_thin, the page rendered client-side and came back as an empty shell — call this again with run_js=True, which returns a job id rather than content because rendering is too slow to hold a tool call open. Poll that id with check_scrape.

Very large pages are not returned inline. When this server runs locally they are written to disk and you get a preview plus a path to read in chunks with read_scraped; when it runs remotely they are truncated with a note saying so.

extractA

Pull named fields off a page as JSON, without writing selectors.

Costs more than scrape — the page is parsed by a model, per call — so the user is asked to approve each run. Scrape the page and read it yourself when a page you were going to read anyway would answer the question; use this when you want the fields themselves, in a shape you can compute on.

check_scrapeA

Check a JavaScript-rendering job started by scrape or extract.

While it says running, poll again in ~10 seconds — and do other work between polls. A render runs 30-150s, so a dozen polls are normal and a job still running at 100s is not stuck. The finished result is returned in full.

read_scrapedA

Read a chunk of a scraped page that was offloaded to disk.

Use the path from a scrape result's content_offloaded. Start at offset 0 and keep calling with the returned next_offset until eof is true — and stop as soon as you have what you need rather than reading the whole file by reflex. Returns text plus offset, returned_chars, total_chars, next_offset and eof.

list_scrapersA

List the scrape endpoints this API implements, or describe one of them.

Call this before assuming a dedicated scraper does or does not exist for a target, then call it again with the endpoint name to see what that endpoint accepts. That is the authoritative parameter list — more current than any documentation. Run the endpoint itself with scrape_target.

scrape_targetA

Call a target-specific scrape endpoint with its own parameters.

The generic scrape tool reads any URL. This runs the dedicated scrapers instead — the ones with pagination, store context, sort order and the rest. Look the endpoint up with list_scrapers(), read its parameters with list_scrapers(endpoint), then call it here. A run_js in params returns a job id to poll, same as scrape.

Prompts

Interactive templates invoked by user choice

NameDescription
web_researchLoad the Web API skill and start a cited research loop on a question.

Resources

Contextual data attached and managed by the client

NameDescription
oxylabs_web_api_skillHow to use these tools: search to find and scrape to read, when JavaScript rendering is worth its cost, what to do with an empty page, and the citation rules that keep an answer honest. Read it before a research task.

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct role: scrape (generic URL fetch), search (web search), extract (structured field extraction), check_scrape (async job polling), read_scraped (chunked disk reads), list_scrapers (endpoint discovery), and scrape_target (dedicated parametric scrapers). The scrape vs. scrape_target overlap is explicitly resolved in descriptions, and the async/scrape workflow is cleanly separated from synchronous reads.

Naming Consistency4/5

All names use snake_case and mostly follow a verb_noun pattern (check_scrape, read_scraped, list_scrapers, scrape_target). A few core tools are bare verbs (scrape, search, extract) without an object noun, a minor deviation from the otherwise predictable convention.

Tool Count5/5

Seven tools is a tight, well-scoped set for a web scraping API. Each tool covers a necessary capability (fetch, search, extract, async polling, disk read, discovery, parametric scrape) with no filler.

Completeness4/5

The surface covers the full scraping lifecycle: discovery (list_scrapers), generic and target-specific fetching, structured extraction, async rendering with polling, and offloaded-content reading. Minor gaps like batch/multi-URL operations or site crawling aren't represented, but core workflows are complete.

Maintenance

ActivityMaintained
ResponsivenessNo issues