String Web Access
ai.usestring/web-accessVersion 1.3.8Search the web, fetch any URL and map a site as clean, LLM-ready Markdown.
Status
Responds320 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 13:34 UTC
- Latency
- 320 ms
- Remotes responding
- 1 of 1
- Sign-in
- API key
- Hosting
- Hosted outside the EU (detected)
- Registry data as of
- Nov 14, 2026, 22:14 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://mcp.usestring.ai/v1/mcpResponds320 msNo sign-in
Claude Code
claude mcp add --transport http web-access https://mcp.usestring.ai/v1/mcp --header 'Authorization: Bearer <YOUR_TOKEN>'Replace <YOUR_TOKEN> before running.
Claude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: web-access
Remote MCP server URL: https://mcp.usestring.ai/v1/mcp
This server expects the header Authorization.Cursor
{
"mcpServers": {
"web-access": {
"url": "https://mcp.usestring.ai/v1/mcp",
"headers": {
"Authorization": "Bearer <YOUR_TOKEN>"
}
}
}
}Replace <YOUR_TOKEN> before running.
VS Code
code --add-mcp '{"name":"web-access","type":"http","url":"https://mcp.usestring.ai/v1/mcp","headers":{"Authorization":"Bearer <YOUR_TOKEN>"}}'Replace <YOUR_TOKEN> before running.
Streamable HTTP
npm: @usestring/mcp 1.3.8Package only
npm (npx)
claude mcp add web-access -e 'STRING_AI_API_KEY=<YOUR_STRING_AI_API_KEY>' -- npx -y @usestring/mcp@1.3.8Replace <YOUR_STRING_AI_API_KEY> before running.
Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
4 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
web_access_fetchFetch a caller-specified HTTP(S) URL and get clean, LLM-ready Markdown back.
**Primary use (the common case):** pass only a `url`. The page is fetched with a normal GET and returned as Markdown — no other parameters are needed.
```json
{ "url": "https://example.com/article" }
```
**Best for:** any URL, especially sites that block automated traffic or render their content client-side (news, docs, blogs, web apps).
**Not for:** searching the web when you don't have a URL — use web_access_search instead.
**Optional parameters (omit unless you need them):**
- `format` — `markdown` (default), `raw` (the destination's verbatim body), or `json` (a `{ statusCode, headers, data }` envelope with the destination's status and headers).
- `executeJS` — set true to render JavaScript for SPAs when the content comes back empty.
- `actions` — drive a real browser (click, scroll, type, wait) before capturing the page. See below.
**To send a direct POST, PUT or PATCH** (with a body), use `web_access_request` — this tool's direct HTTP path only issues GETs. Plenty of those calls are reads: a GraphQL query, a search backend that takes a body, a JSON API that refuses GET.
- `headers` — forward custom request headers; not combinable with `executeJS` or `actions`, which run in a browser.
- `countryCode` — ISO 3166-1 alpha-2 (e.g. "US") to route through a proxy in that country.
- `solveCaptcha` — defaults true; set false to fail fast instead of spending effort solving a challenge.
**Returns:** Markdown by default; the verbatim body or a JSON envelope when `format` is set accordingly.
---
## `actions` — driving the page instead of just loading it
An `actions` sequence runs in a real browser session and returns the page as it stands after the last step. Use it when the content you need does not exist in the document until something happens to the page: a click past a consent gate, a search form submitted, a "load more" button, a tab or accordion opened, or rows that only render once s | Yes | No | No | Yes |
web_access_requestSend a POST, PUT or PATCH request to any URL, through String's Web Access API. It works like web_access_fetch, but for calls that submit data rather than read a page — a JSON API that only accepts POST, a GraphQL endpoint, a search backend that takes a body.
**Use web_access_fetch instead** whenever you only need to read a page. This tool sends a body to the destination rather than reading it, so use it only for a request the user actually asked for.
**Usage Example:**
```json
{
"url": "https://api.example.com/search",
"method": "POST",
"body": { "q": "widgets" }
}
```
**Returns:** The destination's response, in the requested format. | Yes | No | No | Yes |
web_access_searchSearch the public web for a caller-specified query and get ranked organic results back, plus whatever Google rendered around them: knowledge panel, AI overview, People also ask, local pack, videos, discussions. Google's images, videos, shopping, books, places and forums tabs are searched with `searchType`.
**Primary use:** pass a `query` string. There is no engine or domain-filter parameter; any other key is rejected before the call.
```json
{ "query": "site:arxiv.org retrieval augmented generation" }
```
**Optional targeting fields:** `country` — ISO 3166-1 alpha-2 code the search runs from, e.g. `GB` (default `US`); `language` — results language tag such as `en` or `pt-br`.
```json
{ "query": "plumbers", "country": "GB", "language": "en" }
```
To search from a place, send `location`, a place name such as `London` or `Austin,Texas,United States` (1 to 200 characters), or `coordinates`, `{ latitude, longitude, radius }` with radius in meters (default 5000). The search is sent from that place's country; if both are sent, `coordinates` win. A name that cannot be placed fails, so send `coordinates` instead. On the results page the place biases results toward it. The effect is strongest for queries like `plumbers near me`, and it is not exact city targeting: a bare query such as `coffee shops` may still return results from a wider area.
```json
{ "query": "plumbers near me", "location": "Austin,Texas,United States" }
```
**Optional request field:** `searchCount` — how many organic results you want, an integer from 1 to 300 (above 300 is rejected). Google is paged, up to 36 pages, until that many are in hand; each page is billed as one search. Many queries run out before 300: Google often has 100-200 results for a query, and you get what it has, with `paging.complete: true` and `paging.stoppedBy: "end_of_results"`. Omit it for one page, about 10 results, and the response then carries no `paging`. Not with `format: "raw"`, which returns one page per call.
```json
{ "qu | No | Yes | No | Yes |
web_access_sitemapManage an asynchronous crawl of authorized public pages on one website. Starting from one URL, the crawler follows same-domain links breadth-first and can also seed from the site's /sitemap.xml. Requests must comply with destination policy, robots directives, rate limits, and access controls.
Use this tool to discover pages for site audits, authorized retrieval worklists, or coverage checks before fetching individual pages.
**Not for:** reading one page's content (use web_access_fetch) or open-ended web queries (use web_access_search).
This single tool drives the whole job lifecycle through `action`:
**1. `submit` — quote a crawl (nothing is crawled or billed yet).** Requires `url`. Optional: `maxPages` (1–10000, default 10), `maxDepth` (1–100, default 2), `pathPrefix` (only crawl URLs whose path starts with this, e.g. "/docs"), `budgetUsd` (spend ceiling; the crawl stops with status token_cap_exceeded if it would exceed it), `useSitemap` (also seed the site's root /sitemap.xml — one extra billed page, but finds pages links miss). A `maxPages` or `maxDepth` outside its range, 0 included, is rejected rather than replaced by the default — omit the field to get the default. Returns `jobId`, `estimatedPages`, and `estimatedCostUsd` with status `awaiting_approval`.
```json
{ "action": "submit", "url": "https://example.com", "maxPages": 200, "maxDepth": 3 }
```
**2. `approve` — start the quoted crawl (requires `jobId`).** This is the billing-consent step: pages are billed as they are fetched, capped by the quote/budget. Before approving a non-trivial `estimatedCostUsd`, confirm the spend with your user. Fails with status 402 if the account balance cannot cover the quote; a 409 partial_state error means an earlier approve was interrupted — just call approve again.
**3. `status` — poll progress (requires `jobId`).** Statuses: `awaiting_approval` → `running` → terminal `completed` | `failed` | `canceled` | `token_cap_exceeded` (budget hit before maxPages; collected resu | Yes | No | No | Yes |
Details
- Registry status
- Active
- Published
- Nov 3, 2026
- Updated
- Nov 3, 2026
- Categories (suggested)
- AI modelsSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared