---
title: read_web_page
description: Read one public web page, such as the website of a brand, as text.
---

Give the agent the address of a website. The agent reads the page as text, and it can then write a brand from what the page says.

> "Create a brand from northwind.example."

The agent calls `read_web_page` for the home page. It then reads up to four more pages of the same site, such as the about page and the pricing page, and it calls [`brand_create`](/mcp/tools/brand-create). You then see the new brand with the sections that the site states. The agent asks you for each other section.

The job guide [Describe a brand](/mcp/tools/describe-a-brand) shows each step of the job.

## Reference

Read one public web page that the user named, such as the website of a brand. You get its text as markdown, and the links to other pages of the same site. One call reads one page. To learn more about a site, read the home page, then choose the next pages from `links`, such as the about, product and pricing pages. The Tool obeys the robots.txt of the site, and it reads no page behind a sign-in. Use the text only for what the page states: do not invent what it does not say.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string, at most 2048 characters | yes | The full address of a public page, with `http://` or `https://`. |

### Output

A successful call returns this object in `structuredContent`.

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `links` | array of string | yes | The links of the page to other pages of the same site, in the order of the page, at most 50. Choose the next page to read from them. |
| `markdown` | string | yes | The text of the page, as markdown. At most 40,000 characters. |
| `truncated` | boolean | yes | `true` when the page holds more than 40,000 characters, and `markdown` holds only the first 40,000. |
| `url` | string | yes | The address of the page that the Tool read. |

### Failure codes

A failed call has `isError` set, and `structuredContent.error` holds one of these codes. [Errors](/mcp/errors) describes the shape of a failed call.

- `disallowed_by_robots`
- `empty_page`
- `unreachable`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `web:read`. [Auth & scopes](/mcp/auth) lists each scope.

### Annotations

A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.

- **Read-only.** The tool changes nothing.
- **Open world.** The tool reaches a system outside AdCrunch, such as an ad platform.

### Example

The arguments:

```json
{
  "url": "https://northwind.example/"
}
```

The result, in `structuredContent`:

```json
{
  "links": [
    "https://northwind.example/about",
    "https://northwind.example/pricing"
  ],
  "markdown": "# Northwind Outdoor\n\nTrail gear, built to be repaired. Every jacket carries a lifetime repair promise.\n\n[About us](/about) · [Pricing](/pricing)",
  "truncated": false,
  "url": "https://northwind.example/"
}
```
