스마트 HTTP 요청, 프록시 로테이션, 풀 브라우저 렌더링을 통해 AI agent가 봇 탐지를 우회하고 안정적으로 웹에 접속할 수 있도록 지원합니다.
다른 이름 fouradata/mcp, @fouradata/mcp
- 스타
- 7
- Tools
- 3
- 다운로드, 30일
- —
- 최신 버전
- 0.8.3
- 마지막 커밋
- 2026년 11월 11일
- 라이선스
- MIT
FourA MCP란?
FourA은(는) MCP server입니다. 스마트 HTTP 요청, 프록시 로테이션, 풀 브라우저 렌더링을 통해 AI agent가 봇 탐지를 우회하고 안정적으로 웹에 접속할 수 있도록 지원합니다. 3개 도구를 제공합니다. 예: browser, version, profile.
프로젝트 README에서 생성된 요약
FourA MCP server 정보
FourA MCP는 웹 스크래핑과 봇 탐지의 복잡한 과정을 관리하여 AI agent에게 안정적인 웹 접속 환경을 제공합니다. 개발자는 agent에게 공개 URL을 전달하기만 하면 되며, 대상 웹사이트의 차단 난이도에 따라 다양한 방식으로 콘텐츠를 수신할 수 있습니다. 이 server는 npm package를 사용하여 stdio 방식으로 로컬에서 실행하거나, FourA API key를 사용하여 호스팅된 streamable HTTP 엔드포인트로 연결할 수 있습니다. Claude Desktop, Cursor, Windsurf, VS Code를 포함한 여러 MCP client와 호환됩니다.
이 시스템은 다양한 웹 상호작용 요구 사항을 처리하기 위해 네 가지 특정 도구를 제공합니다. foura_auto 도구는 최적의 fetch 방식을 자동으로 선택하는 스마트 기본 도구 역할을 합니다. 더 세밀한 제어가 필요한 경우, 빠른 HTTP 요청을 위한 foura_single, 자동 재시도 기능이 포함된 로테이션 프록시용 foura_proxy, 또는 풀 브라우저 렌더링을 위한 foura_browser를 사용할 수 있습니다. 이러한 도구들을 통해 사용자는 Chrome이나 Firefox 같은 브라우저 유형과 Windows 또는 iOS 같은 운영체제를 지정함으로써 차단을 우회할 수 있습니다.
활용 사례
- 1봇 탐지 우회개발자는 로테이션 프록시를 통해 요청을 라우팅하여 접근이 어려운 페이지나 특정 국가의 접속 환경에 도달할 수 있습니다.
- 2특정 사용자 환경 시뮬레이션agent가 특정 브라우저와 운영체제 조합인 것처럼 가장하여 페이지를 요청할 수 있습니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
FourA MCP 설치 방법
형식 확인: 2026년 11월 10일Claude Code에 FourA MCP 설치
$ claude mcp add --env FOURA_API_KEY=<YOUR_FOURA_API_KEY> mcp -- npx -y @fouradata/mcpCursor에 FourA MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"mcp": {
"command": "npx",
"args": [
"-y",
"@fouradata/mcp"
],
"env": {
"FOURA_API_KEY": "<YOUR_FOURA_API_KEY>"
}
}
}
}VS Code에 FourA MCP 설치
.vscode/mcp.json
{
"servers": {
"mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@fouradata/mcp"
],
"env": {
"FOURA_API_KEY": "<YOUR_FOURA_API_KEY>"
}
}
}
}Claude Desktop에 FourA MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"mcp": {
"command": "npx",
"args": [
"-y",
"@fouradata/mcp"
],
"env": {
"FOURA_API_KEY": "<YOUR_FOURA_API_KEY>"
}
}
}
}Codex에 FourA MCP 설치
~/.codex/config.toml
[mcp_servers.mcp] command = "npx" args = ["-y", "@fouradata/mcp"] [mcp_servers.mcp.env] FOURA_API_KEY = "<YOUR_FOURA_API_KEY>"
Gemini CLI에 FourA MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"mcp": {
"command": "npx",
"args": [
"-y",
"@fouradata/mcp"
],
"env": {
"FOURA_API_KEY": "<YOUR_FOURA_API_KEY>"
}
}
}
}FourA MCP 도구 3
README에서 감지됨browserversionprofile
| browser | — | |
| version | — | |
| profile | — |
구성
FOURA_API_KEY필수비밀Your FourA API key (pk_live_...), managed at https://foura.ai/dashboard/#api-keys
| 이름 | 설명 | 유형 |
|---|---|---|
| FOURA_API_KEY | Your FourA API key (pk_live_...), managed at https://foura.ai/dashboard/#api-keys | 필수비밀 |
자동 검사
2026년 11월 12일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능통과
- 오픈 소스 라이선스 (OSI)통과
- 최근 1년 내 커밋 또는 릴리스통과
- 패키지 이름이 인기 패키지와 유사하지 않음통과
- 원격 엔드포인트가 HTTPS 사용통과
- 파괴적인 도구에 라벨 표시됨통과
- 모델에 대한 숨겨진 지침 없음통과
- 패키지와 의존성에 심각한 보안 권고 없음통과
README
GitHub에서 보기Start with foura_auto: one URL in, typed content out. It chooses the appropriate fetch method and handles common blocks for you. Use foura_single, foura_proxy, or foura_browser when you want explicit control over the request path.
| Start simple | Reach difficult pages | Build predictable agent flows |
|---|---|---|
| One default tool for most URLs | HTTP, proxy rotation, and full-browser rendering | Typed outputs, stable error codes, and six ready-made prompts |
The included workflows cover product extraction, article cleanup, price monitoring, endpoint checks, and bulk URL fetching.
Use it from Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, or any MCP client. Run the npm package locally or connect to the hosted Streamable HTTP endpoint with the same FourA API key.
Get an API key | Read the MCP docs | See the package on npm
One-click install:
Both buttons pre-fill the config with a YOUR_FOURA_API_KEY placeholder - replace it with your key. Or by hand: claude mcp add foura -- npx -y @fouradata/mcp (set FOURA_API_KEY in env first). Full per-client setup below.
Quick Start - local stdio (recommended for Claude Desktop)
Create or reveal an API key at foura.ai/dashboard/#api-keys (format pk_live_...). Then drop this into your MCP client's config:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "@fouradata/mcp"],
"env": {
"FOURA_API_KEY": "pk_live_..."
}
}
}
}
Claude Desktop gotcha: fully quit Claude Desktop (
Cmd+Qon macOS) before editing the config file. If the app is still running, it will overwrite your edits with its in-memory config on exit.
The npx command downloads the package on first launch and runs it as a subprocess of your MCP client. No global install needed. The same JSON works across MCP clients; only the config-file location changes:
| Client | Where the config lives |
|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json |
| Claude Code | claude mcp add foura -- npx -y @fouradata/mcp (set FOURA_API_KEY in env first) |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| VS Code (MCP extension) | .vscode/mcp.json in your workspace |
Restart the client and foura_auto, foura_single, foura_proxy, foura_browser show up in your tool list, plus six prompts under /prompts.
Quick Start - hosted (Streamable HTTP)
If your client supports the Streamable HTTP transport, point it at the hosted endpoint instead of running a local subprocess:
{
"mcpServers": {
"foura": {
"url": "https://mcp.foura.ai/mcp",
"headers": {
"Authorization": "Bearer pk_live_..."
}
}
}
}
For Claude Desktop, use the stdio config above. You can also bridge the hosted endpoint through mcp-remote:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.foura.ai/mcp", "--header", "Authorization: Bearer pk_live_..."]
}
}
}
The Tools
foura_auto is the default - give it a URL and it returns the content, choosing the fetch method for you. The other three tools give you direct control over HTTP, proxy rotation, and browser rendering.
All four are marked readOnlyHint: true and openWorldHint: true per the MCP specification. Clients can use those annotations when deciding how to present or approve tool calls.
Every response carries human-readable text (content) plus a typed structuredContent JSON object validated against the tool's outputSchema. Your agent gets a predictable response contract instead of parsing prose.
foura_auto - smart fetch (the default)
Give it a URL and get the content back. Use this first when you don't want to choose between HTTP, proxy rotation, and browser rendering. It handles common bot challenges and keeps the client surface small, with no proxy-attempt tuning required.
{
"url": "https://example.com",
// optional: a substring the real page must contain, so auto can tell a
// real page from a challenge page on protected targets
"validate": { "data": { "accept": ["Example Domain"] } }
}
The client surface is intentionally minimal: url (required), plus optional method, headers, data, validate, returnSession (default true), forceProxy (default true), timeout_ms (5000-180000, default 120000), ignoreProxies, exitClass (standard or premium, as on foura_proxy).
structuredContent shape: {status, headers, data, meta, session}. meta is always present - {rung, solved, attempts, credits} - so your agent can see how the request completed and how many credits it used. session ({proxy, cookies, userAgent}) is returned by default for follow-up requests (pass session.proxy into the proxy field). Send returnSession: false to omit it. There is no total_time field on auto.
exitClass: "premium" lets auto escalate to a premium exit once the standard pool cannot reach the page, and the result's exitClass says which class delivered. The standard pool goes first; once the premium traffic in your plan is spent the call goes on in the standard pool and reports standard. Neither class is an error. On a plan without premium exits the call is refused with code: "plan_limit_premium". exitClass: "standard" keeps auto off premium exits.
foura_single - fast HTTP
One HTTP request, response back. Use it for static pages, JSON APIs, and server-rendered HTML. unblocker defaults to true, so the request already carries a full browser header set; set it to false for a plain HTTP request.
{
"method": "GET",
"url": "https://example.com"
}
Supports custom headers, a body, per-stage timeouts, redirect controls, JSON auto-parse, a binary-buffer mode, and built-in response validation (validate.status.accept, validate.data.fail, and so on). If foura_single comes back blocked - status 403/429, a captcha page, challenge response headers, or a known challenge title - try a different browser profile (below), then escalate to foura_proxy. Start with maxTries: 5; protected targets may need 25-30. If the page also needs JavaScript to render, pass foura_proxy's returned proxy ID to foura_browser.proxy.
structuredContent shape: {status, headers, data, total_time, ...}. When the target ran a bot check, the response also carries defense; defense.solved: false means the body may be a challenge page rather than the content you asked for.
Choosing which browser you present
By default a request presents the latest Google Chrome. Some targets accept one browser and refuse another, so foura_single and foura_proxy let you pick:
{
"method": "GET",
"url": "https://example.com",
"browser": "Firefox",
"os": "Windows"
}
browser-Chrome,Edge,Safari,Firefox, orTor.os-Windows,macOS,Android, oriOS. A family name accepts any of its versions; the exact labels in the catalogue narrow further.version- any version the catalogue lists for that browser. The newest match wins when several fit.profile- an exact id from the catalogue, when you already have one.
The full catalogue is public at api.foura.ai/api/profiles, no key required, and its default field names the profile a request gets when you ask for nothing. Selection needs unblocker on, which is the default. A combination that does not exist returns an error listing what is available, so a request is never quietly sent as a browser you did not choose.
foura_proxy - rotating proxies with retry
Same target shape as foura_single, but routed through rotating proxies with automatic retry on failure. Use it when a direct request is blocked or when the target requires a specific exit country.
{
"maxTries": 5,
"exitCountries": ["CZ", "GB"],
"request": {
"method": "GET",
"url": "https://example.com/pricing",
"browser": "Chrome",
"os": "Windows"
}
}
structuredContent adds proxy (the encoded ID of the proxy that succeeded) and total (outer timing including selection and retries). When the rotation had to move to another browser to get an answer, profile names the catalogue profile it settled on; pass it as profile to present the same browser on the next call. exitCountries is optional: values are trimmed, uppercased, and deduplicated; proxies with unknown exits are excluded; the request never falls back to an unrequested country. Selection uses the latest available country metadata, normally updated within ten minutes, and a scoped success returns that value as exitCountry. If no eligible proxy matches, the result uses code: "no_eligible_proxy".
The inner request takes the same browser-profile fields as foura_single: browser, os, version, or an exact profile.
exitClass - for a target the standard pool cannot reach. Set exitClass: "premium" and the request may escalate to a premium exit instead of only rotating within the standard pool. It is an allowance, not an instruction: the standard pool still races for the answer and usually wins, and a request it answers before any premium exit is tried costs no premium traffic. Once a premium exit has been tried, the traffic it carried counts toward your premium allowance even if that attempt failed; an attempt still running when another exit answered is stopped and not counted. The response reports exitClass back, premium or standard, so you can see per request which one served you. standard is also the answer once the premium traffic in your plan is spent, and it is a normal result, not an error. exitClass: "standard" forbids escalation outright. On a plan without premium exits the call is refused with code: "plan_limit_premium".
attemptReport - why a rotation ran out of tries. Every failed foura_proxy result carries it beside the error. summary is one sentence; the counts underneath separate causes with opposite fixes: noResponse (the exit never answered), defense (a bot check was recognised, named in vendors), contentRejected (HTTP 200, no bot check, rejected only by your own validate.data), statusRejected, and other. profilesTried lists the browsers the task sent, in first-use order, with default meaning the request went out exactly as written. A high contentRejected means the pages arrived and your own rule threw them away: fetch one with foura_single and no validate, look at it, and rewrite the rule.
For difficult WAF challenges, use maxTries: 25-30. For a country allowlist, set exitCountries instead of increasing attempts. If the target needs JavaScript rendering, pass the returned proxy ID to foura_browser.proxy.
foura_browser - full browser session
A real browser session. JavaScript runs, the DOM finishes rendering, cookies come back with the response. Use it when the page is a single-page app, when content lazy-loads after first paint, or when there's an anti-bot challenge that needs a real browser to clear.
{
"url": "https://example.com/spa",
"timeout_ms": 15000,
"checkText": "data-table"
}
Use this when an HTTP response isn't enough. checkText validates the rendered HTML once navigation completes; it doesn't wait or poll. If the substring is missing, the call fails with an error envelope. This catches pages that return 200 without the content you need. unblocker defaults to true and handles supported anti-bot or captcha challenges along the way. Set it to false to return the page exactly as it loads, challenge included.
structuredContent shape is intentionally different from single/proxy: {status, headers (object, not array), body (not data), cookies (full browser cookie shape), userAgent}.
Built-in Prompts
Six workflow templates surfaced under /prompts in your MCP client. They orchestrate one or more tools without you spelling out the steps.
| Prompt | Arguments | What it does |
|---|---|---|
smart_fetch |
url, must_contain?, extract? |
Pick the method, handle bot protection, and return or extract content |
scrape_product_page |
url |
Extract title, price, image, stock, and SKU as JSON in a browser session |
extract_article |
url |
Fetch an article, retry through a proxy if needed, and remove page chrome |
monitor_pricing |
url, target_price? |
Fetch the current price and compare it with a target |
check_endpoint_health |
url, expected_text? |
Validate reachability, status, content, and timing |
bulk_fetch_urls |
urls (comma-separated) |
Fetch URLs in parallel, retry blocked ones, and return metadata |
Each prompt arrives as a templated user message your LLM executes with the right tools. The full prompt text enters the context only when you invoke it.
Full recipe text + manual fallback prompts: foura.ai/docs/mcp/recipes. For the full error code list, see foura.ai/docs/mcp/errors.
Authentication
Use FOURA_API_KEY in stdio mode or an Authorization: Bearer pk_live_... header with the hosted endpoint. One key authenticates all four tools.
Keys are managed in the dashboard, where you can create, reveal, rotate, or deactivate them. See foura.ai/docs/getting-started/authentication for the full key-management walkthrough.
Error envelope - typed contract for agent retries
Every error (isError: true) carries a structuredContent envelope with at minimum these three fields:
{
"service": "auto" | "single" | "proxy" | "browser",
"code": "ssrf_blocked" | "auth_failed" | "rate_limited" | ...,
"error": "Human-readable message"
}
Where the upstream returned a status, you also get status (HTTP code) and on rate-limit / capacity errors the FourA API envelope adds retryAfter, current.{concurrency, rpm}, limits.{maxConcurrency, maxRpm}.
code |
When | Retry safe? |
|---|---|---|
ssrf_blocked |
Target resolves to a private or reserved address | No - change the URL |
upstream_non_json |
Upstream returned malformed body | Maybe - investigate |
bad_request (400) |
Input shape rejected by FourA | No - fix arguments |
auth_failed (401) |
Key missing, invalid, or deactivated | No - fix the key |
forbidden (403) |
Authenticated but not allowed | No |
not_found (404) |
Target / endpoint doesn't exist | No |
rate_limited (429) |
RPM cap hit | Yes - wait retryAfter |
at_capacity (503) |
Concurrency cap hit | Yes - wait retryAfter |
service_disabled (503) |
Maintenance window | Yes - wait retryAfter |
service_unavailable (503) |
Generic 503 | Yes - short backoff |
upstream_error (>=500) |
Upstream 5xx | Yes - exponential backoff |
upstream_client_error (4xx) |
Other 4xx | Usually no |
no_eligible_proxy |
No proxy matches the requested exitCountries |
No - change the country scope |
plan_limit_* (403/429) |
Your own FourA plan refused the call, not the target | Only retryAfter clears it - see below |
A plan_limit_ code names which of your plan's limits refused the call: credits, bandwidth, rate, concurrency, browser_daily, premium, or feature. It is not the target blocking you, so retrying the same work through another tool spends the rest of the allowance for nothing. Wait out retryAfter where there is one, or change the plan.
LLM agents can read code directly for retry logic without parsing prose. Spec reference: foura.ai/docs/api/errors.
What every result carries
Beside the tool's own fields, each result reports what the call cost and how to trace it:
credits- credits this call spent, on failures as well, because the work was done either way;request_id- FourA's id for the call. Quote it in a support request;exitClass-premiumwhen a premium exit served the call. Onfoura_singleandfoura_browserthat happens whenproxyreplays a premium exit thatfoura_proxyorfoura_autofound; onfoura_proxyandfoura_autoit is reported whenever the request named anexitClass.
Combining the tools - reuse the same exit
The lower-level tools compose. foura_proxy returns the base36 ID of the exit it used. Pass that ID into foura_single.proxy or foura_browser.proxy to reuse the same exit for the next request.
// 1. Find a working exit. Difficult protected targets may need maxTries:25-30.
const r = await foura_proxy({
maxTries: 30,
request: { method: "GET", url: "https://probe.example.com" }
});
// Returns { status: 200, proxy: "4DZ3VE", ... }
// 2. Reuse it for follow-up HTTP
await foura_single({ method: "GET", url: "https://target/api", proxy: r.proxy });
// 3. Or render JavaScript through the same exit.
await foura_browser({ url: "https://target/spa", proxy: r.proxy });
For a protected JavaScript page, find a working route with foura_proxy before calling foura_browser. Starting in the browser can return the challenge page before the real content loads.
To choose a different proxy on the next foura_proxy call, pass the previous ID as ignoreProxies: ["4DZ3VE"]. The proxy field on foura_single and foura_browser also accepts raw URLs (http://host:port, socks5://...) if you have your own list.
Large responses - offload_large (default: inline)
By default (since v0.2.0), full response bodies are returned inline in structuredContent regardless of size. This works in every MCP client.
If your client supports MCP resources/read (and you want to save tokens on big pages), pass offload_large: true per tool call. Responses of 50 KB or more are returned as a resource_link, and your client fetches the body only when it needs it. The resource remains available for one hour.
{
"method": "GET",
"url": "https://en.wikipedia.org/wiki/Web_scraping",
"offload_large": true // opt in for token savings
}
Support for MCP resource links varies by client. Leave offload_large at its default false if your client can't read resource_link blocks.
Only the API key that created an offloaded resource can read it back.
Limits and responsible use
- Private targets are refused. Requests to private or reserved addresses are blocked at the MCP layer. Only public-internet hosts are forwarded.
- Rate limits are enforced by the FourA API per service. Concurrency + RPM. Details at foura.ai/docs/api/rate-limits.
Use FourA only for public content you are authorized to access and in accordance with the target site's terms and applicable law.
Run it yourself
Run the stdio server directly from npm with npx -y @fouradata/mcp, or build the included Dockerfile for the Streamable HTTP transport.
Configurable environment:
| Variable | Default | Purpose |
|---|---|---|
PORT |
3076 |
HTTP listen port |
FOURA_API_BASE |
https://api.foura.ai/api |
Upstream FourA REST base URL |
FOURA_MCP_PAYLOADS_DIR |
/data/payloads |
Where responses of 50 KB or more are cached on disk |
See DEVELOPMENT.md for the local build and test workflow.
License
MIT. See LICENSE.
Links
- FourA (web scraping API): https://foura.ai
- MCP server page: https://foura.ai/mcp
- Source (GitHub): https://github.com/fouradata/mcp
- npm package: https://www.npmjs.com/package/@fouradata/mcp
- API documentation: https://foura.ai/docs
- MCP server reference: https://foura.ai/docs/mcp/server
- MCP error codes: https://foura.ai/docs/mcp/errors
- MCP recipes: https://foura.ai/docs/mcp/recipes
- REST API errors: https://foura.ai/docs/api/errors
- MCP specification: https://modelcontextprotocol.io
- Get a key: https://foura.ai/dashboard/#api-keys
FourA MCP 질문
FourA MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add --env FOURA_API_KEY=<YOUR_FOURA_API_KEY> mcp -- npx -y @fouradata/mcp를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
FourA MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
FourA MCP는 어떤 도구를 제공하나요?
3개 도구를 제공합니다. 예: browser, version, profile.
AI agent에서 FourA를 어떻게 시작하나요?
foura_auto 도구를 사용하면 됩니다. URL을 입력하면 가장 적합한 fetch 방식을 자동으로 선택하여 일반적인 차단 문제를 해결합니다.
요청에 사용할 브라우저나 운영체제를 제어할 수 있나요?
네, 특정 대상의 요구 사항에 맞춰 브라우저(Chrome, Firefox 등)와 운영체제(Windows, macOS 등)를 명시적으로 지정할 수 있습니다.
직접적인 HTTP 요청이 차단되면 어떻게 되나요?
foura_proxy 도구를 사용할 수 있습니다. 이 도구는 로테이션 프록시를 통해 요청을 라우팅하며 실패 시 자동으로 재시도합니다.
서버에서 구조화된 데이터를 제공하나요, 아니면 일반 텍스트만 제공하나요?
모든 응답에는 사람이 읽을 수 있는 텍스트와 스키마 검증을 거친 타입화된 structuredContent JSON 객체가 포함되어 있어 agent가 예측 가능한 응답을 받을 수 있습니다.