Foura

ai.foura由 foura.ai 發布官方發布者v0.8.3更新於 Oct 30, 2026

Reliable web access for AI agents: smart HTTP, rotating proxies, and full-browser rendering.

已驗證Streamable HTTP可網頁執行網頁搜尋與抓取瀏覽器自動化

概覽

AI 產生的概覽

FourA 讓助理可靠地抓取網頁:一般 HTTP、輪換代理或完整瀏覽器工作階段,可依網址自動選擇或手動指定。

可以做什麼
  • 依網址自動從 HTTP 升級到代理再到瀏覽器抓取內容,回傳結構化結果與可重複使用的連線
  • 送出單次 HTTP 請求,支援自訂標頭、請求內容、Cookie、瀏覽器指紋與回應驗證
  • 透過輪換代理重試請求,支援出口國家白名單與 premium 出口升級
  • 在完整瀏覽器工作階段中載入頁面,執行 JavaScript、回傳 Cookie 並處理支援的驗證挑戰
  • 提供內建工作流程提示,用於商品資訊擷取、文章清理、價格監控、端點健康檢查與批次抓取
適用情境
當助理需要一般抓取拿不到的頁面內容時適用:JSON 介面與靜態頁面、被封鎖或受地區限制的目標,以及需要 JavaScript 渲染的單頁應用程式。定位是網頁抓取與內容取得,而非互動式瀏覽。
執行需求
需要 FourA API 金鑰(FOURA_API_KEY,格式 pk_live_...),於 FourA 控制台取得。可在本機以 Node.js 透過 npx 執行 npm 套件 @fouradata/mcp,或連線託管的 Streamable HTTP 端點並在 Authorization Bearer 標頭帶入金鑰。需要連上 FourA API 的網路,用量依方案計費。
安裝前請注意
此 API 金鑰是可計費的憑證:每次呼叫都會消耗額度,失敗的呼叫同樣計費,premium 出口另佔獨立額度。請求會送往 FourA 伺服器,由其代為抓取目標,因此目標網址、標頭、Cookie 與請求內容會提供給該第三方。只應抓取你有權存取的公開內容。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Foura,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/ai.foura%2Fmcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "foura": {
      "type": "http",
      "url": "https://mcp.foura.ai/mcp"
    }
  }
}

README

[FourA]

FourA MCP

Reliable web access for AI agents.

Give your agent a public URL. FourA returns the content, whether the page needs a fast HTTP request, proxy rotation, or a full browser session.

[npm version] [npm provenance] [MIT license] [FourA MCP score on Glama] [Tool Definition Quality Score for FourA MCP] [FourA on Smithery]

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 simpleReach difficult pagesBuild predictable agent flows
One default tool for most URLsHTTP, proxy rotation, and full-browser renderingTyped 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:

[Add to Cursor] [Install in VS Code]

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:

json
{  "mcpServers": {    "foura": {      "command": "npx",      "args": ["-y", "@fouradata/mcp"],      "env": {        "FOURA_API_KEY": "pk_live_..."      }    }  }}

Claude Desktop gotcha: fully quit Claude Desktop (Cmd+Q on 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:

ClientWhere the config lives
Claude Desktop (macOS)~/Library/Application Support/Claude/claude_desktop_config.json
Claude Desktop (Windows)%APPDATA%\Claude\claude_desktop_config.json
Claude Codeclaude 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:

json
{  "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:

json
{  "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.

jsonc
{  "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.

jsonc
{  "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:

jsonc
{  "method": "GET",  "url": "https://example.com",  "browser": "Firefox",  "os": "Windows"}
  • browser - Chrome, Edge, Safari, Firefox, or Tor.
  • os - Windows, macOS, Android, or iOS. 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.

jsonc
{  "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.

jsonc
{  "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.

PromptArgumentsWhat it does
smart_fetchurl, must_contain?, extract?Pick the method, handle bot protection, and return or extract content
scrape_product_pageurlExtract title, price, image, stock, and SKU as JSON in a browser session
extract_articleurlFetch an article, retry through a proxy if needed, and remove page chrome
monitor_pricingurl, target_price?Fetch the current price and compare it with a target
check_endpoint_healthurl, expected_text?Validate reachability, status, content, and timing
bulk_fetch_urlsurls (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:

jsonc
{  "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}.

codeWhenRetry safe?
ssrf_blockedTarget resolves to a private or reserved addressNo - change the URL
upstream_non_jsonUpstream returned malformed bodyMaybe - investigate
bad_request (400)Input shape rejected by FourANo - fix arguments
auth_failed (401)Key missing, invalid, or deactivatedNo - fix the key
forbidden (403)Authenticated but not allowedNo
not_found (404)Target / endpoint doesn't existNo
rate_limited (429)RPM cap hitYes - wait retryAfter
at_capacity (503)Concurrency cap hitYes - wait retryAfter
service_disabled (503)Maintenance windowYes - wait retryAfter
service_unavailable (503)Generic 503Yes - short backoff
upstream_error (>=500)Upstream 5xxYes - exponential backoff
upstream_client_error (4xx)Other 4xxUsually no
no_eligible_proxyNo proxy matches the requested exitCountriesNo - change the country scope
plan_limit_* (403/429)Your own FourA plan refused the call, not the targetOnly 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 - premium when a premium exit served the call. On foura_single and foura_browser that happens when proxy replays a premium exit that foura_proxy or foura_auto found; on foura_proxy and foura_auto it is reported whenever the request named an exitClass.

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.

jsonc
// 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 HTTPawait 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.

jsonc
{  "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:

VariableDefaultPurpose
PORT3076HTTP listen port
FOURA_API_BASEhttps://api.foura.ai/apiUpstream FourA REST base URL
FOURA_MCP_PAYLOADS_DIR/data/payloadsWhere 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

來源:README.md,提交 3973a09

工具

4

foura_single

FourA - single HTTP request

Send one HTTP request and return the response. Use it for static pages, JSON APIs, and server-rendered HTML, with your own headers, body and cookies. Set browser, os, or version when a target refuses the default Chrome. Pass a proxy id returned by foura_proxy to leave from that same exit. validate decides what counts as success, so a response it rejects comes back as a failure instead of as content; the timeouts nest, with timeout_ms bounding the whole request and the connect, accept and server_response ones bounding stages inside it. Switch to foura_proxy when the response is blocked or the exit country matters, and to foura_browser when the page needs JavaScript. One FourA API key authenticates every call, the result reports the credits it spent, and a refusal by your own plan arrives as a plan_limit_ code with retryAfter rather than as a block by the target.

輸入參數osurl必填dataproxymethod必填browserheadersprofileversionvalidateunblockertimeout_ms另有 8 個

foura_proxy

FourA - HTTP request via rotating proxies

Route an HTTP request through rotating proxies, retrying on another exit until one delivers. Use it when foura_single is blocked, and whenever the exit itself matters: this is the only tool that takes a strict exit-country allowlist (exitCountries, which never falls back to another country), presents a named browser family per attempt, excludes exits you already know are dead (ignoreProxies), and may escalate to a premium exit (exitClass, an allowance rather than an instruction). maxTries bounds how many exits are tried and timeout_ms bounds the whole rotation, so a short timeout can end it before maxTries is reached; protected targets often need 25 to 30. validate decides what counts as delivered, and an attempt it rejects is retried on the next exit. The response returns the id of the exit that succeeded: pass that returned id to foura_single.proxy or foura_browser.proxy to send the next request from the same exit. A failed rotation returns attemptReport, which separates exits that never answered from exits a bot check refused from pages your own rule threw away. Use foura_browser when the page needs JavaScript. Rotation costs several times a single request. One FourA API key authenticates every call, the result reports the credits it spent, and a refusal by your own plan arrives as a plan_limit_ code with retryAfter rather than as a block by the target.

輸入參數request必填maxTriesexitClasstimeout_msexitCountriesignoreProxiesoffload_large

foura_browser

FourA - full browser navigation

Load a public URL in a full browser session. JavaScript runs, the DOM renders, and cookies come back with the response. Use it for single-page apps, lazy-loaded content, or supported browser challenges. You can set your own headers, cookies and userAgent, and checkStatus or checkText turn a navigation that rendered the wrong page into a failure instead of returning it as content. For a protected page, call foura_proxy first and pass its returned proxy ID here to reuse that same exit, instead of starting a new selection here; with no proxy the session leaves from one fixed address. Set unblocker:false when you want the page exactly as it loads, challenge included. It is the most expensive of the four tools and the slowest, so prefer foura_single or foura_proxy whenever the content is already in the HTML. One FourA API key authenticates every call, the result reports the credits it spent, and a refusal by your own plan arrives as a plan_limit_ code, including plan_limit_browser_daily when the daily browser allowance is spent.

輸入參數url必填proxycookiesheaderscheckTextunblockeruserAgenttimeout_mscheckStatusoffload_large

foura_auto

FourA - auto (smart fetch, picks the method for you)

Give it a public URL and get the content back. Use it when only the content matters and not how it is fetched: it escalates from a direct request to a rotating proxy to a full browser only as far as the target forces, and returns the session that worked so the next call can replay it. On protected targets, or whenever HTTP 200 may still be a challenge or an incomplete page, pass validate.data.accept with text unique to the real content; auto makes bounded attempts and returns either validated content or a failure, and cannot guarantee a match. It owns its own retry settings, so there is no maxTries here, and timeout_ms is the budget for every attempt together rather than for one. What it cannot do is the reason to reach for another tool: a strict exit country and a pinned exit live on foura_proxy (auto can only avoid exits, through ignoreProxies, or escalate to a premium exit with exitClass); choosing which browser is presented to the target lives on foura_single and foura_proxy; a scripted browser session lives on foura_browser. A request that names any of those belongs there rather than here. One FourA API key authenticates every call, the result reports the credits it spent, which is the sum of the attempts it made, and a refusal by your own plan arrives as a plan_limit_ code with retryAfter rather than as a block by the target.

輸入參數url必填datamethodheadersvalidateexitClassforceProxytimeout_msignoreProxiesoffload_largereturnSessionfollowRedirects

版本歷史

6
  1. v0.8.3最新Oct 29, 2026
  2. v0.8.2Oct 24, 2026
  3. v0.8.1Oct 9, 2026
  4. v0.7.3Sep 23, 2026
  5. v0.7.2Sep 17, 2026
  6. v0.7.1Sep 16, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分