> ## Documentation Index
> Fetch the complete documentation index at: https://docs.prisme.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Web Reader

> Let your agent read the content of a web page from its URL, with your approval for each new website and a companion skill that tells it when to read rather than search

The **Web Reader** is an MCP capability that lets an agent read a web page from its URL and get its content back as Markdown. Use it when the user pastes a link, asks about a specific page, or when the answer needs the actual content behind a search result rather than its snippet. Web search returns snippets; Web Reader returns the page.

It sits alongside MCP servers, Custom Tools, Skills, and File Search under the agent's **Capabilities** tab, and ships as two catalog entries:

| Catalog entry | Type | Role |
| - | - | - |
| **Web Reader** | MCP tool | the `web_read` and `web_read_many` tools that read the pages |
| **Web Reader (skill)** | Skill | tells the agent *when* to read a page rather than search, how much to read, and how to treat what comes back |

> [!NOTE]
>
> Add **both** for the best behaviour: the tool gives the capability, the skill gives the judgement. The tool works on its own, but the skill makes the agent read the right pages, size its reads, and relay failures plainly.

## Add it to an agent

1. Open your agent → **Capabilities** → **Add capability**.
2. Pick **Web Reader** (category *Search*). The server URL is pre-filled; nothing to type.
3. (Recommended) Add **Web Reader (skill)** as well.

## Approving a new website

The first time the agent wants to read a website in a conversation, the chat pauses on an approval card that names the website and shows the full address the agent is about to open. Nothing is read before you answer.

* **Approve**: the page is read and the agent picks up. That website is not asked again for the rest of the conversation.
* **Reject**: the agent is told you said no and continues without the page.

The card shows the full address because that address is what the website receives. If it carries text from the conversation that you did not expect, reject it.

When a page redirects to another website, that other website is asked for in turn, before anything is read from it. When the agent reads several pages at once, one card lists every new website.

> [!NOTE]
>
> **Why the approval.** A page the agent reads may contain hidden instructions written for the model. Without approval, such a page could get the agent to open `https://some-site.example/?d=<text from your conversation>` and leak that text to a website without any action from you. The approval puts you between the agent and every new website.

Websites your administrator allows in advance are read without a card (see [For administrators](#for-administrators)). Sub-agents never show a card: when a delegated agent needs a website you have not approved, the read is refused.

## The tools

### `web_read`

| Argument | Required | Description |
| - | - | - |
| `url` | yes | Absolute `http` or `https` address of the page |
| `max_chars` | no | Maximum characters of Markdown returned. Default 25,000. |
| `include_links` | no | Keep inline links as `[label](url)`. Default `true`. |

### `web_read_many`

| Argument | Required | Description |
| - | - | - |
| `urls` | yes | Up to 5 absolute `http` or `https` addresses |
| `max_chars` | no | Total budget shared across the pages. Default 40,000. |
| `include_links` | no | Keep inline links. Default `true`. |

Each page is read independently: a page that fails comes back with its reason while the others keep their content.

A successful read returns the page as Markdown with a citation of the address actually read, after redirects. A long page is cut at `max_chars`, and the text says so at the end. A result longer than about 30,000 characters is moved out of the conversation into a paginated artifact, as for any tool.

## What it can and cannot read

* **Web pages, plain text, JSON and XML.** HTML is converted to Markdown: headings, lists, tables, code blocks and links are kept, and navigation, footers and hidden text are dropped.
* **No JavaScript.** A page that builds itself in the browser comes back empty, and the agent says so instead of inventing content.
* **No documents.** A PDF, an image or an Office file behind a URL is refused. Attach the file to the conversation instead, where it is parsed and indexed.
* **Public websites only.** Internal and private network addresses, cloud metadata endpoints and the platform's own API are always refused, whatever the configuration. Each redirect is checked against the same rules before it is followed.
* **Bounded requests.** Each request stops after 15 seconds without data, and a response larger than 5 MB is not downloaded.

## Page content is treated as data

Everything a page returns was written by whoever runs that website. The tool puts a warning first, then the page between two markers the page cannot know in advance or fake, and the skill tells the agent never to follow instructions found in a page. This narrows the risk of prompt injection; it does not remove it. Keep the approval of each new website, and do not give an agent that reads the web tools that act without approval.

## For administrators

The tool's settings live in the configuration of the **Web Reader** workspace (`tools-web-reader`) and apply to every agent that uses it:

| Setting | Default | Effect |
| - | - | - |
| **Allowed domains** | empty | Domains read without an approval card, subdomains included (`europa.eu` also allows `eur-lex.europa.eu`). When the list is set, **only** these domains can be read. Empty means any public website, each one approved by the user once per conversation. |
| **Default character limit per page** | 25,000 | Keep it under 30,000, past which the result moves into a paginated artifact. |
| **Maximum URLs per call** | 5 | Pages read by one `web_read_many` call. |
| **Maximum redirects per page** | 5 | Each one is checked before it is followed. |
| **Request timeout** | 15 s | Inactivity timeout of each request. |
| **Maximum response size** | 5 MB | Larger responses are not downloaded. |
| **User-Agent** | `Prisme.ai Web Reader (+https://prisme.ai)` | Sent with each request, so website owners can identify the traffic. |

> [!WARNING]
>
> Web Reader needs a platform version whose runtime can check redirects and response sizes. On an older version, every read is refused with *"Web Reader cannot read pages on this platform version"*, and an error event is recorded. Update the platform to use it.

A textual check cannot detect a public name that resolves to a private address. If your platform runs in a private network, also restrict the runtime's outbound traffic at the network level.

## Errors

The tool tells the agent what happened, and the skill has it relay the reason rather than guess at the content:

| Message | Meaning |
| - | - |
| *needs the user's approval* | A card was shown; the agent waits for your answer. |
| *returned no readable text* | The page renders with JavaScript. |
| *answered HTTP 403 / 404* | The page is private, gone, or blocks automated readers. |
| *serves a PDF document / an image / …* | Not a web page: attach the file instead. |
| *not in the allowed list* | Your administrator restricts which domains can be read. |
| *Internal and private network addresses* / *Platform URLs* / *redirected to an address this tool does not read* | The address is refused on purpose. |
| *larger than this tool reads* | The response exceeds the maximum size. |
| *cannot read pages on this platform version* | The platform must be updated, see above. |

## Next Steps

> [card] [Capabilities](https://docs.prisme.ai/products/agent-factory/capabilities.md)
>
> Add and configure the other capabilities of your agent

> [card] [Tool permissions](https://docs.prisme.ai/products/agent-factory/tool-permissions.md)
>
> Hold other tool calls for human approval


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.