Model Context Protocol · v0.3.0

Web Scraping Tools
Your AI Agent Can Call

The FineData MCP server gives an agent nine tools: read a page, send a POST or DELETE, queue work, submit a batch, poll or cancel a job, and check its own token balance. Pages arrive as markdown by default — the format a language model actually reads — and only successful requests are billed.

Run it locally over stdio with npx or pip, or connect to the hosted endpoint over Streamable HTTP and sign in with OAuth instead of pasting a key.

Connect in one config block

Every MCP client reads the same mcpServers object — Cursor, Claude Desktop, Claude Code, Windsurf, Cline and the rest. Pick the shape that matches how you run the agent.

Local, with a key

The agent runs the server as a child process. Best for an agent on your own machine.

{
  "mcpServers": {
    "finedata": {
      "command": "npx",
      "args": ["-y", "@finedata/mcp-server"],
      "env": { "FINEDATA_API_KEY": "fd_your_api_key" }
    }
  }
}

Python instead of Node: pip install finedata-mcp

Remote, with a key

Nothing to install or update. Best for hosted agents and CI.

{
  "mcpServers": {
    "finedata": {
      "url": "https://mcp.finedata.ai/mcp",
      "headers": { "Authorization": "Bearer fd_your_api_key" }
    }
  }
}

Keys come from your dashboard and carry your own plan and balance.

Remote, with sign-in

No credentials in the config at all. Best when someone else runs the agent.

{
  "mcpServers": {
    "finedata": {
      "url": "https://mcp.finedata.ai/mcp"
    }
  }
}

The client registers itself and opens a browser to sign in. See how that works.

The nine tools

Each one is annotated for the agent: whether it only reads, whether repeating it is safe, and roughly what it costs. An agent that understands those hints stops polling in a loop and stops paying for retries it did not need. Reading and writing are deliberately separate tools — scrape_url is always a GET, so a client can run it without asking, while anything that may change something at the other end goes through send_http_request.

Tool What it does Scope
scrape_url Read one page with GET and return markdown, HTML, links or structured JSON. scrape:write
send_http_request Send POST, PUT, PATCH or DELETE through the same pipeline, for forms and write APIs. scrape:write
scrape_async Queue a page and get a job id back, for slow targets or long batches. scrape:write
get_job_status Poll one queued job and read its result when finished. jobs:read
list_jobs List recent jobs with their state, to resume after a restart. jobs:read
cancel_job Stop a queued job that is no longer needed. scrape:write
batch_scrape Submit many URLs in one call with shared options. scrape:write
get_batch_status Track a batch and collect per-URL results. jobs:read
get_usage Read token balance and consumption, so the agent can budget itself. usage:read

A call looks like this

{
  "url": "https://example.com/product/1",
  "formats": ["markdown"],
  "stealth_premium": true,
  "use_isp": true
}

Escalate by cost, not by habit

Start with a plain request. If a page comes back empty or refuses to serve, step up: stealth_antibot, then stealth_premium together with use_isp — that pairing is the strongest common step, and premium on datacenter routing alone is much weaker.

use_residential and use_mobile exist for genuinely geo- or IP-sensitive targets, not as a default. The server returns the next step as a hint, so the agent escalates on evidence rather than on a guess.

Sign-in instead of a shared key

An API key is a bearer secret: whoever holds it is you. That is fine for an agent you run yourself and awkward for one you hand to a teammate or a customer. The remote endpoint therefore speaks OAuth 2.1, so each person connects their own account.

What happens

  1. The client discovers the endpoint's metadata and registers itself — no client id to create by hand.
  2. A browser opens on a consent screen naming the client and the scopes it asks for.
  3. You sign in to your own account and approve. The client receives a short-lived token, verified with PKCE so an intercepted redirect is useless.
  4. Requests bill to your account. The token lasts an hour and renews quietly for up to 30 days.

What the token cannot do

Approving "scrape on my behalf" grants exactly that. The token reaches the nine tools and nothing else: it cannot create API keys, change your plan, spend from your wallet, or read your profile — the endpoints behind those actions refuse it outright.

Scopes are enforced, not decorative: a client granted read-only scopes can poll jobs and cannot start them. Revoke a connection from your dashboard at any time; changing your password cuts every connected agent as well as every browser session.

Why cost matters more for agents

Failures are not billed

An agent retrying on its own judgement would otherwise be an open budget. You pay for requests that returned the page.

The agent can see the bill

Every response reports tokens_used, and get_usage reports the balance — so a loop can stop itself instead of discovering the cost afterwards.

Markdown by default

Raw HTML burns context for nothing. Long pages are truncated with a note rather than silently cut, so the model knows what it did not see.

Questions

What is the FineData MCP server?

It is a Model Context Protocol server that gives an AI agent nine web-scraping tools: read a page, send a POST or DELETE, queue work asynchronously, submit batches, poll or cancel jobs, and read token usage. It runs locally over stdio via npx or pip, or remotely over Streamable HTTP at https://mcp.finedata.ai/mcp. Pages come back as markdown by default, which is what a language model reads best.

How do I connect FineData MCP to Cursor or Claude Desktop?

Add one entry to the client's mcpServers config. Locally: command "npx" with args ["-y", "@finedata/mcp-server"] and FINEDATA_API_KEY in env. Remotely: url "https://mcp.finedata.ai/mcp" with an Authorization: Bearer header, or no credentials at all if the client supports OAuth, in which case the client registers itself and opens a browser sign-in.

Do I need an API key, or does OAuth replace it?

Either works. An API key is simplest for a server-side agent you control. OAuth suits a client you hand to someone else: the user signs in to their own FineData account, approves the scopes on a consent screen, and usage bills to their account rather than yours. Nothing is copied or pasted, and the connection can be revoked later.

What can an agent do with an OAuth connection to my account?

Only the nine tools, and only what the approved scopes cover: scrape:write to fetch and cancel, jobs:read to poll, usage:read to check the balance. The token is confined to those endpoints, so it cannot create API keys, change a plan, touch billing or read profile data. It expires after an hour, refreshes for up to 30 days, and is revoked by a password change or from the dashboard.

How much does an MCP scrape cost?

Tokens per successful request, and failed requests are not billed. A plain fetch is about 3 tokens; heavier rendering and residential or ISP routing cost more, and the tool descriptions carry the current per-mode figures so the agent can pick the cheapest option that works. The response reports tokens_used, so an agent can measure instead of guessing.

Which modes should an agent try first?

Cheapest first. Start with a plain request; if the page comes back empty or blocked, retry with stealth_antibot, then with stealth_premium plus use_isp, which is the strongest common step. Reserve use_residential and use_mobile for targets that are genuinely geo or IP sensitive rather than using them by default. The server returns the next step as a hint, so the agent does not have to hardcode the ladder.

Is the MCP server open source, and where is it published?

The server is published as finedata-mcp on PyPI and @finedata/mcp-server on npm, and is listed in the MCP Registry. The remote endpoint publishes OAuth Authorization Server Metadata and Protected Resource Metadata, so a compliant client can discover and connect to it without any hand-written configuration.

Agents act quickly and at volume, which makes the rules matter more, not less. Collect only what you have a lawful basis to collect, respect each site's terms and robots directives, and keep request rates civil. Our Acceptable Use Policy sets the boundaries, and we make no representation that scraping any particular site is permissible.