# ai.foura/mcp (npm · @fouradata/mcp)

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

- Trust score: 79/100 (medium)
- Change this week: +30
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `mcp.foura.ai`: 78/100, [markdown](https://verifymcp.io/servers/ai-foura-mcp/mcp.md), [page](https://verifymcp.io/servers/ai-foura-mcp/mcp)
- npm · `@fouradata/mcp`: 79/100 (this document), [markdown](https://verifymcp.io/servers/ai-foura-mcp/fouradata-mcp.md), [page](https://verifymcp.io/servers/ai-foura-mcp/fouradata-mcp)

## Channel facts

- Registry: `npm`
- Package: `@fouradata/mcp`
- Version: `0.5.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (95 of 96), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (95 of 96), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to fouradata/mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 20 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 72/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2000 tokens (~500/item across 4 items; 4 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add ai-foura-mcp -- npx -y @fouradata/mcp
```

### Codex

```bash
codex mcp add ai-foura-mcp -- npx -y @fouradata/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-foura-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@fouradata/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ai-foura-mcp --command npx --arg -y --arg @fouradata/mcp
```

### Hermes

```yaml
mcp_servers:
  ai-foura-mcp:
    command: "npx"
    args: ["-y", "@fouradata/mcp"]
```

### Other

```json
{
  "mcpServers": {
    "ai-foura-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@fouradata/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 79, +59)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Provenance: unverified → pass
- [security] The attested source repository moved: fouradata/mcp
- [functional regression] Security disclosure: unverified → fail
- [functional improvement] Stability: unverified → 0.27
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] License: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] Licence: MIT

### 2026-08-02 (score 20, −30)

- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Security disclosure: fail → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Schema quality: 100 → unverified

### 2026-08-01 (score 50, −11)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-31 (score 61, +12)

- [security regression] Malware scan: pass → unverified
- [security improvement] Provenance: unverified → pass
- [security improvement] Install scripts: unverified → pass
- [security] The attested source repository moved: fouradata/mcp
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] License: unverified → pass
- [functional improvement] Schema quality: unverified → excellent
- [functional] Licence: MIT

### 2026-07-29 (score 49, +25)

- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → 100

### 2026-07-28 (score 24, −25)

- [functional regression] Schema quality: 100 → unverified
- [functional regression] Tool coverage: 100 → unverified

### 2026-07-27 (score 49)

First indexed and scored.

## MCP tools (4)

### `foura_single` (~711 tokens)

FourA - single HTTP request

Send one HTTP request and return the response. Use it for static pages, JSON APIs, and server-rendered HTML. Set unblocker:true for targets that reject basic HTTP requests. Switch to foura_proxy if the response is blocked, and use foura_browser when the page needs JavaScript.

Input parameters:

- `accept_timeout_ms` (integer): Timeout in ms to receive the first response byte after the request is sent (0-120000). Omit for the default.
- `connect_timeout_ms` (integer): Timeout in ms for establishing the TCP/TLS connection (0-120000). Omit to use the default.
- `data`: Request body. Strings sent as-is; objects auto-serialized to JSON. Example: {"query": "hello"} for POST APIs.
- `dns_cache_timeout_sec` (integer): How long (seconds) to cache the target's resolved DNS (0-240). Omit for the default.
- `followRedirects` (integer): Max number of redirects to follow (0-20). Omit to disable redirect following.
- `headers` (array): Custom HTTP headers as [name, value] tuples. Example: [["Accept", "application/json"], ["Referer", "https://google.com/"]]
- `method` (string, required): HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, or any WebDAV verb like PROPFIND/MKCOL)
- `offload_large` (boolean): If true, response bodies of 50 KB or more are returned as a resource_link instead of inlined. Default false. Read the returned offloaded_resource_uri with resources/read.
- `proxy` (string): Optional proxy. Two forms: (1) URL `http://host:port` or `socks5://host:port`; (2) base36 ID from foura_proxy (e.g. `4DZ3VE`) to reuse the same exit. For rotation, use foura_proxy.
- `returnBuffer` (boolean): Return raw bytes as a serialized Buffer JSON shape (`{type:"Buffer", data:[byte, ...]}`, bytes 0-255) instead of decoded string. Use for binary responses (images, protobuf). Reconstruct: `Buffer.from…
- `server_response_timeout_ms` (integer): Timeout in ms for the server to send the complete response (0-120000). Omit for the default.
- `timeout_ms` (integer): Overall request timeout in ms (max 120000, default 15000)
- `tryJsonData` (boolean): If true, attempt JSON.parse on the response body. On success, `data` is the parsed value (typically object or array). On parse failure, `data` silently stays as the original string - no error, no war…
- `unblocker` (boolean): Add common browser headers such as User-Agent, Sec-Ch-Ua, and Accept-Encoding. Default false. Enable it for targets that reject basic HTTP requests.
- `url` (string, required): Public target URL. Private or reserved targets return `ssrf_blocked`. Use {ts} in the URL to insert the current Unix timestamp. Example: https://api.example.com/v1/users.
- `validate` (object): Post-fetch response validation. When the response fails these checks the tool returns an error envelope.

Output parameters:

- `code` (string): Stable error code for retry classification. auth_failed means the FourA API key was rejected; verify that key, not target-site credentials. Other codes: ssrf_blocked, upstream_non_json, output_valida…
- `current` (object): Caller's current usage at error time
- `data`: Decoded response body. String by default; object when tryJsonData=true and the body parsed as JSON; serialized Buffer JSON shape (`{type:"Buffer", data:[byte, ...]}`, bytes 0-255) when returnBuffer=t…
- `error` (string): Human-readable error message
- `headers`: Response headers per redirect hop, as an array of objects. Each entry has `result.{version, code, reason}` plus arbitrary header-name keys whose values are strings (or arrays of strings for multi-val…
- `limits` (object): Per-service limits at error time
- `offloaded_resource_uri` (string): foura-mcp://payload/<uuid>. Pass this URI to resources/read to retrieve the offloaded body.
- `retryAfter` (number): Seconds to wait before retrying (429/503)
- `service` (string)
- `size_bytes` (integer): Total offloaded body size in bytes
- `status` (integer): HTTP status code from the target. `0` indicates the request failed before any HTTP response (DNS failure, connection refused, timeout) - check the `error` field for the underlying reason.
- `total_time`: Wall-clock request duration in seconds. Number when present; string in some variants; null when the request never started.

### `foura_proxy` (~341 tokens)

FourA - HTTP request via rotating proxies

Route an HTTP request through rotating proxies with automatic retry. Use it when foura_single is blocked or the target requires a specific exit country. The response includes the proxy ID that succeeded; reuse it with foura_single or foura_browser, or exclude it with ignoreProxies. Use foura_browser when the page needs JavaScript. Set exitCountries for a strict country allowlist.

Input parameters:

- `exitCountries` (array): Optional target-visible proxy countries as two-letter provider codes, for example ["CZ", "GB"]. Use codes supplied by the user or target requirements. When geography matters, do not guess codes or su…
- `ignoreProxies` (array): Encoded proxy IDs (base36 strings like "4DZ3VE") or proxy URLs to exclude from rotation.
- `maxTries` (integer): Maximum rotation attempts before giving up (default 5, max 90). Difficult protected targets may need 25-30. Use exitCountries for country scope.
- `offload_large` (boolean): If true, response bodies of 50 KB or more are returned as a resource_link instead of inlined. Default false. Read the returned offloaded_resource_uri with resources/read.
- `request` (object, required): The inner HTTP request to send through each proxy attempt. Validation rules here determine when a proxy is treated as failed and retried.
- `timeout_ms` (integer): Overall timeout across all rotation attempts in ms (default 45000, max 120000). Must be positive.

Output parameters:

- `code` (string): Stable error code for retry classification. auth_failed means the FourA API key was rejected; verify that key, not target-site credentials. no_eligible_proxy means the strict exitCountries scope had…
- `current` (object)
- `data`: Decoded response body. Omitted when offloaded.
- `details` (object): Structured no_eligible_proxy context containing the normalized requested country scope. Preserve this scope and retry later. Do not propose or perform an unscoped fallback; change it only after the u…
- `error` (string): Human-readable error message
- `exitCountry` (string): Latest available two-letter target-visible exit-country code used for selection. Present on successful requests that use exitCountries.
- `headers`: Response headers per redirect hop, as an array of objects. Each entry has `result.{version, code, reason}` plus arbitrary header-name keys whose values are strings (or arrays of strings for multi-val…
- `limits` (object)
- `offloaded_resource_uri` (string): foura-mcp://payload/<uuid>. Pass this URI to resources/read to retrieve the offloaded body.
- `proxy` (string): Base36 ID of the exit that succeeded (e.g. `4DZ3VE`). Pass it to foura_single.proxy or foura_browser.proxy to reuse that exit, or to foura_proxy.ignoreProxies to skip it on future rotations.
- `request`: Echoed PrRequest from upstream PrResponseError
- `retryAfter` (number)
- `service` (string)
- `size_bytes` (integer): Total offloaded body size in bytes
- `status` (integer): HTTP status code from the target (from the succeeding proxy attempt). `0` indicates every attempt failed before any HTTP response (DNS / connection refused / timeout) - check the `error` field for th…
- `total` (number): Outer total time in seconds (proxy selection + retries + the successful inner attempt). Float.
- `total_time`: Per-attempt wall-clock duration of the succeeding inner request

### `foura_browser` (~456 tokens)

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. For a protected page, call foura_proxy first and pass its returned proxy ID here to reuse that exit. Set unblocker:false when you want the page exactly as it loads.

Input parameters:

- `checkStatus` (integer): Expected HTTP status code. A different status returns an error envelope carrying the actual value. Example: 200 for a product page.
- `checkText` (string): Validate the rendered HTML once navigation completes. This is a substring check, not a waiter, and it doesn't poll. A missing substring returns an error envelope. Example: "add to cart" for a product…
- `cookies` (array): Cookies to set before navigation: [{ name, value, domain? }]
- `headers` (object): Custom HTTP headers as a key-value object rather than [name, value] tuples. Example: {"Referer": "https://google.com/"}
- `offload_large` (boolean): If true, response bodies of 50 KB or more are returned as a resource_link instead of inlined. Default false. Read the returned offloaded_resource_uri with resources/read.
- `proxy` (string): Optional proxy. Three forms: (1) URL `http://user:pass@host:port` or `socks5://host:port`; (2) base36 ID from foura_proxy (e.g. `4DZ3VE`) to reuse the same exit; (3) omit to use the default route.
- `timeout_ms` (integer): Page load timeout in ms (default 30000, max 120000)
- `unblocker` (boolean): Handle supported anti-bot or captcha challenges during navigation. Default true. Set false to return the page exactly as it loads, including any challenge page.
- `url` (string, required): Public URL to load in a full browser session. Private or reserved targets return `ssrf_blocked`. Example: https://shop.example.com/product/123.
- `userAgent` (string): Override the browser's User-Agent string

Output parameters:

- `body`: Fully-rendered page content. String HTML when content-type is HTML; object when the page returned JSON and it was auto-parsed. Field is named `body`, not `data`. Omitted when offloaded.
- `code` (string): Stable error code for retry classification. auth_failed means the FourA API key was rejected; verify that key, not target-site credentials. Other codes: ssrf_blocked, upstream_non_json, output_valida…
- `cookies` (array): Full cookie objects collected after navigation, including name, value, domain, path, expiry, and same-site settings.
- `current` (object)
- `error` (string): Human-readable error message
- `headers` (object): Response headers as a flat key-value object. Values are typically strings but may be arrays for repeated headers.
- `limits` (object)
- `offloaded_resource_uri` (string): foura-mcp://payload/<uuid>. Pass this URI to resources/read to retrieve the offloaded body.
- `retryAfter` (number)
- `service` (string)
- `size_bytes` (integer): Total offloaded body size in bytes
- `status` (integer): HTTP status code from the target page. `0` indicates the navigation failed before any HTTP response (DNS / connection refused / timeout) - check the `error` field for the underlying reason.
- `userAgent` (string): The User-Agent the browser session presented

### `foura_auto` (~492 tokens)

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

Give it a public URL and get the content back. This is the default when you don't want to choose between HTTP, proxy rotation, and a full browser. On protected targets, or whenever HTTP 200 may still be a challenge or 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; it cannot guarantee a match. The response includes completion details and, by default, reusable session values for follow-up calls. Use a lower-level tool when you need direct control over HTTP, proxy selection, or browser navigation.

Input parameters:

- `data`: Request body for non-GET methods. Strings sent as-is; objects auto-serialized to JSON.
- `followRedirects` (integer): Follow up to N redirects for HTTP and proxy requests. Default 5; 0 means don't follow. Browser navigation handles redirects itself.
- `forceProxy` (boolean): Require proxy routing for every target request. Default true. Send false to allow direct HTTP when suitable.
- `headers` (array): Custom HTTP headers as [name, value] tuples. Example: [["Accept", "application/json"], ["Authorization", "Bearer ..."]]
- `ignoreProxies` (array): Exits to avoid - base36 proxy IDs (like "4DZ3VE") or proxy URLs. Use this to rotate away from an exit that was just blocked.
- `method` (string): HTTP method for the target request (default GET).
- `offload_large` (boolean): If true, response bodies of 50 KB or more are returned as a resource_link instead of inlined. Default false. Read the returned offloaded_resource_uri with resources/read.
- `returnSession` (boolean): Return reusable {proxy, cookies, userAgent} values for follow-up calls. Default true. Send false for a leaner response when you only need the content.
- `timeout_ms` (integer): Total time budget in ms for the whole operation. Every attempt must fit inside it. Default 120000, max 180000.
- `url` (string, required): Public target URL. Private or reserved targets return `ssrf_blocked`. Use {ts} in the URL to insert the current Unix timestamp. Example: https://example.com/page.
- `validate` (object): Post-fetch response validation. When the response fails these checks foura_auto returns an error envelope.

Output parameters:

- `attempts` (number): Total attempts when the request failed (also present inside `meta`).
- `code` (string): Stable error code for retry classification. auth_failed means the FourA API key was rejected; verify that key, not target-site credentials. Other codes: ssrf_blocked, upstream_non_json, output_valida…
- `current` (object): Caller's current usage at error time
- `data`: Decoded response body of the delivered page. String by default; object when the body parsed as JSON. Omitted when offloaded.
- `error` (string): Human-readable error message when the request could not deliver content within the budget.
- `headers`: Response headers from the successful request, as an array of objects. Each entry has `result.{version, code, reason}` plus header-name keys. The last entry is the final response.
- `limits` (object): Per-service limits at error time
- `meta` (object): Completion details: rung, solved, attempts, and credits. Always present.
- `offloaded_resource_uri` (string): foura-mcp://payload/<uuid>. Pass this URI to resources/read to retrieve the offloaded body.
- `retryAfter` (number): Seconds to wait before retrying a 429 or 503 response
- `service` (string)
- `session` (object): Reusable {proxy, cookies, userAgent} values for follow-up calls. For plain HTTP, call foura_single with session.proxy as proxy, session.userAgent as a User-Agent header, and session.cookies serialize…
- `size_bytes` (integer): Total offloaded body size in bytes
- `status` (integer): HTTP status code from the request that delivered the content. `0` means no HTTP response was received; check `error`.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/ai-foura-mcp/fouradata-mcp#diagnostics

## Score history

- 2026-08-03: 79
- 2026-08-02: 20
- 2026-08-01: 50
- 2026-07-31: 61
- 2026-07-29: 49
- 2026-07-28: 24
- 2026-07-27: 49

## Links

- npm package: https://www.npmjs.com/package/@fouradata/mcp
- Socket report: https://socket.dev/npm/package/@fouradata/mcp
- Repository: https://github.com/fouradata/mcp
- Website: https://foura.ai/mcp
- Changelog RSS feed: https://verifymcp.io/servers/ai-foura-mcp/fouradata-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/ai-foura-mcp/fouradata-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/ai-foura-mcp/fouradata-mcp
