# MCP tools

Source: https://getanalog.io/docs/mcp-reference/

Tool behavior, arguments, and defaults for the Analog MCP server.

`analog-mcp` exposes these tools to MCP-compatible agents. To connect a
client, follow [MCP setup](https://getanalog.io/docs/mcp/).

## Tool behavior

Start with [`analog`](https://getanalog.io/docs/mcp-reference/#analog) to view a page, or [`assess`](https://getanalog.io/docs/mcp-reference/#assess)
for help choosing a representation. Read the returned receipt, then use
the saved handle to preview, search, or open the content you need.
Saved-result tools read local data without fetching the page again.

The `handle` argument accepts an exact handle, a friendly name, or
`latest`. Use an exact handle when returning to the same save across
several calls; `latest` changes when another result is saved.

## Tool arguments

Each example names the tool and shows its JSON arguments. These are
arguments to supply through an MCP client; they are not Python calls
or a complete protocol request.

The examples use one saved [quotes page](https://quotes.toscrape.com/js/).
Replace
`20260912-pvtqdw` with the handle returned by your own call. Live page
content may change. Each combined example shows the complete text response;
clients may display structured responses differently.

<!-- BEGIN GENERATED: mcp-tool-reference -->
<!-- Generated by tools/cli_mcp_reference/render.py; edit the registered MCP schema or renderer. -->

<details class="reference-index">
<summary>Find a tool</summary>

- [`analog`](https://getanalog.io/docs/mcp-reference/#analog)
- [`assess`](https://getanalog.io/docs/mcp-reference/#assess)
- [`analog_history`](https://getanalog.io/docs/mcp-reference/#analog_history)
- [`analog_open`](https://getanalog.io/docs/mcp-reference/#analog_open)
- [`analog_export`](https://getanalog.io/docs/mcp-reference/#analog_export)
- [`analog_section`](https://getanalog.io/docs/mcp-reference/#analog_section)
- [`analog_collection`](https://getanalog.io/docs/mcp-reference/#analog_collection)
- [`analog_find`](https://getanalog.io/docs/mcp-reference/#analog_find)
- [`analog_describe`](https://getanalog.io/docs/mcp-reference/#analog_describe)
- [`analog_feedback`](https://getanalog.io/docs/mcp-reference/#analog_feedback)

</details>



## `analog`

View a page as records, prose, and navigation. Fetching happens on
your machine and structured extraction requires a [connected account](https://getanalog.io/docs/authenticate/).
The tool returns a receipt with section shapes, sample records,
completeness disclosures, and a handle for the saved result.

The receipt's JSON text is capped at 16,384 characters. Read its
`records_complete`, `markdown_complete`, and `omissions` fields before
treating it as the whole page. Saved-result tools below read more from
the handle. If saving fails, recovery remains visible and the receipt
does not claim that the handle is available.

`pagination.collection_confirmed: false` means a next-document link was
found, but it is not known to continue the same collection.

`guidance: true` may add one available call in `next_actions`. It is
off by default. Advice is added only if it fits after the selected
evidence, and never changes samples, omissions, capture settings or errors.

Pass `pages` to follow the page's own next-page links. Each page costs
one extraction, and the receipt reports the sweep. `expand_all` opens
collapsed details; `load_all` follows load-more controls. See
[Fetching](https://getanalog.io/docs/fetching/) for choosing these options.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
analog(url: string, pages: integer = 1, expand_all: boolean = false, load_all: boolean = false, guidance: boolean = false)
```

**Accepted values:**

- `pages` — 1–50.
<!-- END GENERATED: mcp-tool-declaration -->



### View the quotes page

Tool: `analog`

```json example=runnable tool=analog scenario=mcp-analog-quotes
{
  "url": "https://quotes.toscrape.com/js/"
}
```

The receipt reports ten quotes and four navigation records across
three sections. Its samples provide a starting point; section 0 contains
the quotes. Follow the returned handle to read their full values.

<details>
<summary>View output</summary>

```json wrap=true example=output scenario=mcp-analog-quotes
{
  "schema_version": "29",
  "request_id": "9a67f5ce-90b9-43ab-a1c6-6d2347989551",
  "handle": "20260912-pvtqdw",
  "resolved_url": "https://quotes.toscrape.com/js/",
  "mode": "auto",
  "counts": {
    "sections": 3,
    "records": 14,
    "collections": 0,
    "markdown_characters": 1684,
    "withheld_areas": 0
  },
  "records_complete": true,
  "markdown_complete": false,
  "sections": [
    {
      "index": 0,
      "record_count": 10,
      "items_detected": 10,
      "field_count": 3,
      "fields": [
        {
          "name": "tags",
          "type": "text",
          "source": "rendered text",
          "multivalued": true,
          "hidden": false,
          "numeric": false
        },
        {
          "name": "text",
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "hidden": false,
          "numeric": false
        },
        {
          "name": "text_2",
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "hidden": false,
          "numeric": false
        }
      ],
      "fields_omitted": 0,
      "samples": [
        {
          "record_index": 0,
          "fields": [
            {
              "name": "tags",
              "value": [
                "change",
                "deep-thoughts",
                "thinking",
                "world"
              ]
            },
            {
              "name": "text",
              "value": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”"
            },
            {
              "name": "text_2",
              "value": "by Albert Einstein"
            }
          ]
        },
        {
          "record_index": 9,
          "fields": [
            {
              "name": "tags",
              "value": [
                "humor",
                "obvious",
                "simile"
              ]
            },
            {
              "name": "text",
              "value": "“A day without sunshine is like, you know, night.”"
            },
            {
              "name": "text_2",
              "value": "by Steve Martin"
            }
          ]
        },
        {
          "record_index": 1,
          "fields": [
            {
              "name": "tags",
              "value": [
                "abilities",
                "choices"
              ]
            },
            {
              "name": "text",
              "value": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”"
            },
            {
              "name": "text_2",
              "value": "by J.K. Rowling"
            }
          ]
        },
        {
          "record_index": 2,
          "fields": [
            {
              "name": "tags",
              "value": [
                "inspirational",
                "life",
                "live",
                "miracle",
                "miracles"
              ]
            },
            {
              "name": "text",
              "value": "“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”"
            },
            {
              "name": "text_2",
              "value": "by Albert Einstein"
            }
          ]
        },
        {
          "record_index": 3,
          "fields": [
            {
              "name": "tags",
              "value": [
                "aliteracy",
                "books",
                "classic",
                "humor"
              ]
            },
            {
              "name": "text",
              "value": "“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”"
            },
            {
              "name": "text_2",
              "value": "by Jane Austen"
            }
          ]
        },
        {
          "record_index": 4,
          "fields": [
            {
              "name": "tags",
              "value": [
                "be-yourself",
                "inspirational"
              ]
            },
            {
              "name": "text",
              "value": "“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”"
            },
            {
              "name": "text_2",
              "value": "by Marilyn Monroe"
            }
          ]
        },
        {
          "record_index": 5,
          "fields": [
            {
              "name": "tags",
              "value": [
                "adulthood",
                "success",
                "value"
              ]
            },
            {
              "name": "text",
              "value": "“Try not to become a man of success. Rather become a man of value.”"
            },
            {
              "name": "text_2",
              "value": "by Albert Einstein"
            }
          ]
        },
        {
          "record_index": 6,
          "fields": [
            {
              "name": "tags",
              "value": [
                "life",
                "love"
              ]
            },
            {
              "name": "text",
              "value": "“It is better to be hated for what you are than to be loved for what you are not.”"
            },
            {
              "name": "text_2",
              "value": "by André Gide"
            }
          ]
        },
        {
          "record_index": 7,
          "fields": [
            {
              "name": "tags",
              "value": [
                "edison",
                "failure",
                "inspirational",
                "paraphrased"
              ]
            },
            {
              "name": "text",
              "value": "“I have not failed. I've just found 10,000 ways that won't work.”"
            },
            {
              "name": "text_2",
              "value": "by Thomas A. Edison"
            }
          ]
        },
        {
          "record_index": 8,
          "fields": [
            {
              "name": "tags",
              "value": [
                "misattributed-eleanor-roosevelt"
              ]
            },
            {
              "name": "text",
              "value": "“A woman is like a tea bag; you never know how strong it is until it's in hot water.”"
            },
            {
              "name": "text_2",
              "value": "by Eleanor Roosevelt"
            }
          ]
        }
      ],
      "records_omitted": 0,
      "disclosures": {}
    },
    {
      "index": 1,
      "kind": "navigation",
      "placement": "header",
      "record_count": 2,
      "items_detected": 2,
      "field_count": 4,
      "fields": [
        {
          "name": "text",
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "hidden": false,
          "numeric": false
        },
        {
          "name": "url",
          "type": "url",
          "source": "attribute:href",
          "multivalued": false,
          "hidden": false,
          "numeric": false
        },
        {
          "name": "group",
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "hidden": false,
          "numeric": false
        },
        {
          "name": "depth",
          "type": "text",
          "source": "structure",
          "multivalued": false,
          "hidden": false,
          "numeric": true
        }
      ],
      "fields_omitted": 0,
      "samples": [
        {
          "record_index": 0,
          "fields": [
            {
              "name": "text",
              "value": "Quotes to Scrape"
            },
            {
              "name": "url",
              "value": "https://quotes.toscrape.com/"
            },
            {
              "name": "group",
              "value": ""
            },
            {
              "name": "depth",
              "value": "0"
            }
          ]
        },
        {
          "record_index": 1,
          "fields": [
            {
              "name": "text",
              "value": "Login"
            },
            {
              "name": "url",
              "value": "https://quotes.toscrape.com/login"
            },
            {
              "name": "group",
              "value": ""
            },
            {
              "name": "depth",
              "value": "0"
            }
          ]
        }
      ],
      "records_omitted": 0,
      "disclosures": {}
    },
    {
      "index": 2,
      "kind": "navigation",
      "placement": "footer",
      "record_count": 2,
      "items_detected": 2,
      "field_count": 4,
      "fields": [
        {
          "name": "text",
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "hidden": false,
          "numeric": false
        },
        {
          "name": "url",
          "type": "url",
          "source": "attribute:href",
          "multivalued": false,
          "hidden": false,
          "numeric": false
        },
        {
          "name": "group",
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "hidden": false,
          "numeric": false
        },
        {
          "name": "depth",
          "type": "text",
          "source": "structure",
          "multivalued": false,
          "hidden": false,
          "numeric": true
        }
      ],
      "fields_omitted": 0,
      "samples": [
        {
          "record_index": 0,
          "fields": [
            {
              "name": "text",
              "value": "GoodReads.com"
            },
            {
              "name": "url",
              "value": "https://www.goodreads.com/quotes"
            },
            {
              "name": "group",
              "value": ""
            },
            {
              "name": "depth",
              "value": "0"
            }
          ]
        },
        {
          "record_index": 1,
          "fields": [
            {
              "name": "text",
              "value": "Zyte"
            },
            {
              "name": "url",
              "value": "https://www.zyte.com"
            },
            {
              "name": "group",
              "value": ""
            },
            {
              "name": "depth",
              "value": "0"
            }
          ]
        }
      ],
      "records_omitted": 0,
      "disclosures": {}
    }
  ],
  "outline": {
    "regions": 3,
    "extracted": 3
  },
  "pagination": {
    "current_page": 1,
    "max_page_seen": 2,
    "next_url": "https://quotes.toscrape.com/js/page/2/",
    "in_page_controls": false,
    "collection_confirmed": true
  },
  "omissions": {
    "section_summaries": 0,
    "field_summaries": 0,
    "records": 0,
    "sample_fields": 0,
    "list_items": 0,
    "value_characters": 0,
    "warning_entries": 0,
    "browse_actions": 0,
    "markdown_characters": 1684
  }
}
```

</details>





## `assess`

Get a recommendation for how to view a page, together with measured
Markdown size, task guidance, pagination, navigation, and available
feed or sitemap information. This runs locally without sign-in or
structured extraction and does not create a saved result.

Set `probe_feed` to `false` to skip the extra feed and sitemap checks.
The page is still fetched, and information declared in its HTML remains
available. [Assess a page](https://getanalog.io/docs/assess/) explains how to act on the result.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
assess(url: string, probe_feed: boolean = true)
```
<!-- END GENERATED: mcp-tool-declaration -->



### Check how to read the quotes page

Tool: `assess`

```json example=runnable tool=assess scenario=mcp-assess-quotes
{
  "url": "https://quotes.toscrape.com/js/"
}
```

The recommendation is `markdown` for a direct read. The pagination
information also reports a next page. Choose records when you want to
search quotes by field or compare items; the recommendation is advice.

<details>
<summary>View output</summary>

```json wrap=true example=output scenario=mcp-assess-quotes
{
  "recommendation": "markdown",
  "est_markdown_tokens": 426,
  "platform_feed_hint": null,
  "feed_probe": null,
  "sitemap_probe": {
    "status": "none_declared",
    "sitemaps": []
  },
  "declared_feeds": [],
  "pagination": {
    "current_page": 1,
    "max_page_seen": 2,
    "next_url": "https://quotes.toscrape.com/js/page/2/",
    "stated_total": null,
    "stated_total_source": null,
    "in_page_controls": false,
    "collection_confirmed": true
  },
  "navigation_probe": {
    "status": "found",
    "regions": 2,
    "destinations": [
      {
        "label": "Next →",
        "url": "https://quotes.toscrape.com/js/page/2/"
      },
      {
        "label": "GoodReads.com",
        "url": "https://www.goodreads.com/quotes"
      },
      {
        "label": "Zyte",
        "url": "https://www.zyte.com"
      }
    ],
    "truncated": false
  },
  "guidance": "This page as markdown: ~426 tokens (measured). Repeating structure: substantial.\n- pagination: this looks like page 1 of a paginated collection (its links reach page 2) — these records cover this page only. Analog can follow the site's own next links and merge the pages into one result; call `analog` again with the same `url` and `pages: 2`.\nTask-by-task guidance (records vs markdown vs feeds): https://getanalog.io/docs/assess/"
}
```

</details>





## `analog_history`

Recover a saved handle or friendly name from recent result metadata,
newest first. The response includes the URL, save time, section count,
and record count, without returning page content.

`limit` bounds the number of entries. An empty history returns an empty
list; it does not fetch anything.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
analog_history(limit: integer = 20)
```

**Accepted values:**

- `limit` — at least 0.
<!-- END GENERATED: mcp-tool-declaration -->



### Find a recent save

Tool: `analog_history`

```json example=runnable tool=analog_history scenario=mcp-history-quotes
{
  "limit": 3
}
```

This capture used a separate local store containing only the quotes
page, so requesting up to three entries returns one. The text response
is a list; structured responses contain the same list under `entries`.

```json wrap=true example=output scenario=mcp-history-quotes
[
  {
    "handle": "20260912-pvtqdw",
    "url": "https://quotes.toscrape.com/js/",
    "saved_at": "2026-09-12T01:21:00.768156+00:00",
    "name": null,
    "sections": 3,
    "records": 14
  }
]
```





## `analog_open`

Read the full saved result as structured JSON, including its ordered
sections, records, Markdown, collections, and coverage information.
This is the complete-result view, so its response can be large.

Use [`analog_describe`](https://getanalog.io/docs/mcp-reference/#analog_describe) to get your bearings, or
[`analog_section`](https://getanalog.io/docs/mcp-reference/#analog_section) and [`analog_find`](https://getanalog.io/docs/mcp-reference/#analog_find)
when you already know what you want to read.

An unreadable save fails with recovery guidance based on its recorded source.
Browser-backed saves can use `analog` to create a new capture; this does not
restore earlier browser state or capture settings. Supplied pages must be
recreated through their original capture workflow: these MCP tools cannot
ingest supplied HTML or capture files. The store retains neither the input
file nor its path. Unknown acquisition is identified as unknown, and recovery
never runs automatically.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
analog_open(handle: string)
```
<!-- END GENERATED: mcp-tool-declaration -->



### Open the saved quotes page

Tool: `analog_open`

```json example=runnable tool=analog_open scenario=mcp-open-quotes
{
  "handle": "20260912-pvtqdw"
}
```

Unlike the first receipt, this response contains the full saved
records and Markdown. The quotes are in `structured_content[0]`.
The empty `collections` list means this save has no collection to open.

<details>
<summary>View output</summary>

```json wrap=true example=output scenario=mcp-open-quotes
{
  "schema_version": "29",
  "request_id": "9a67f5ce-90b9-43ab-a1c6-6d2347989551",
  "collections": [],
  "structured_content": [
    {
      "records": [
        {
          "tags": [
            "change",
            "deep-thoughts",
            "thinking",
            "world"
          ],
          "text": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”",
          "text_2": "by Albert Einstein"
        },
        {
          "tags": [
            "abilities",
            "choices"
          ],
          "text": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”",
          "text_2": "by J.K. Rowling"
        },
        {
          "tags": [
            "inspirational",
            "life",
            "live",
            "miracle",
            "miracles"
          ],
          "text": "“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”",
          "text_2": "by Albert Einstein"
        },
        {
          "tags": [
            "aliteracy",
            "books",
            "classic",
            "humor"
          ],
          "text": "“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”",
          "text_2": "by Jane Austen"
        },
        {
          "tags": [
            "be-yourself",
            "inspirational"
          ],
          "text": "“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”",
          "text_2": "by Marilyn Monroe"
        },
        {
          "tags": [
            "adulthood",
            "success",
            "value"
          ],
          "text": "“Try not to become a man of success. Rather become a man of value.”",
          "text_2": "by Albert Einstein"
        },
        {
          "tags": [
            "life",
            "love"
          ],
          "text": "“It is better to be hated for what you are than to be loved for what you are not.”",
          "text_2": "by André Gide"
        },
        {
          "tags": [
            "edison",
            "failure",
            "inspirational",
            "paraphrased"
          ],
          "text": "“I have not failed. I've just found 10,000 ways that won't work.”",
          "text_2": "by Thomas A. Edison"
        },
        {
          "tags": [
            "misattributed-eleanor-roosevelt"
          ],
          "text": "“A woman is like a tea bag; you never know how strong it is until it's in hot water.”",
          "text_2": "by Eleanor Roosevelt"
        },
        {
          "tags": [
            "humor",
            "obvious",
            "simile"
          ],
          "text": "“A day without sunshine is like, you know, night.”",
          "text_2": "by Steve Martin"
        }
      ],
      "fields": {
        "tags": {
          "type": "text",
          "source": "rendered text",
          "multivalued": true,
          "traits": [],
          "hidden": false,
          "numeric": false,
          "unit": null,
          "table_group": null
        },
        "text": {
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": false,
          "unit": null,
          "table_group": null
        },
        "text_2": {
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": false,
          "unit": null,
          "table_group": null
        }
      },
      "field_normalized": {},
      "label": "",
      "label_url": "",
      "merge_note": "",
      "kind": "",
      "placement": "",
      "xpath": "/html/body/div",
      "items_detected": 10,
      "withheld_columns": [],
      "withheld_visual": null,
      "withheld_records": 0,
      "declared_total_rows": null,
      "declared_total_columns": null,
      "structural_outliers": [],
      "markdown": "# [Quotes to Scrape](https://quotes.toscrape.com/)\n\n[Login](https://quotes.toscrape.com/login)\n\n“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”by Albert Einstein\n\nTags: change deep-thoughts thinking world\n\n“It is our choices, Harry, that show what we truly are, far more than our abilities.”by J.K. Rowling\n\nTags: abilities choices\n\n“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”by Albert Einstein\n\nTags: inspirational life live miracle miracles\n\n“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”by Jane Austen\n\nTags: aliteracy books classic humor\n\n“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”by Marilyn Monroe\n\nTags: be-yourself inspirational\n\n“Try not to become a man of success. Rather become a man of value.”by Albert Einstein\n\nTags: adulthood success value\n\n“It is better to be hated for what you are than to be loved for what you are not.”by André Gide\n\nTags: life love\n\n“I have not failed. I've just found 10,000 ways that won't work.”by Thomas A. Edison\n\nTags: edison failure inspirational paraphrased\n\n“A woman is like a tea bag; you never know how strong it is until it's in hot water.”by Eleanor Roosevelt\n\nTags: misattributed-eleanor-roosevelt\n\n“A day without sunshine is like, you know, night.”by Steve Martin\n\nTags: humor obvious simile\n\n- [Next →](https://quotes.toscrape.com/js/page/2/)"
    },
    {
      "records": [
        {
          "text": "Quotes to Scrape",
          "url": "https://quotes.toscrape.com/",
          "group": "",
          "depth": "0"
        },
        {
          "text": "Login",
          "url": "https://quotes.toscrape.com/login",
          "group": "",
          "depth": "0"
        }
      ],
      "fields": {
        "text": {
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": false,
          "unit": null,
          "table_group": null
        },
        "url": {
          "type": "url",
          "source": "attribute:href",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": false,
          "unit": null,
          "table_group": null
        },
        "group": {
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": false,
          "unit": null,
          "table_group": null
        },
        "depth": {
          "type": "text",
          "source": "structure",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": true,
          "unit": null,
          "table_group": null
        }
      },
      "field_normalized": {
        "depth": [
          0.0,
          0.0
        ]
      },
      "label": "",
      "label_url": "",
      "merge_note": "",
      "kind": "navigation",
      "placement": "header",
      "xpath": "/html/body/div/div[1]",
      "items_detected": 2,
      "withheld_columns": [],
      "withheld_visual": null,
      "withheld_records": 0,
      "declared_total_rows": null,
      "declared_total_columns": null,
      "structural_outliers": [],
      "markdown": "# [Quotes to Scrape](https://quotes.toscrape.com/)\n\n[Login](https://quotes.toscrape.com/login)"
    },
    {
      "records": [
        {
          "text": "GoodReads.com",
          "url": "https://www.goodreads.com/quotes",
          "group": "",
          "depth": "0"
        },
        {
          "text": "Zyte",
          "url": "https://www.zyte.com",
          "group": "",
          "depth": "0"
        }
      ],
      "fields": {
        "text": {
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": false,
          "unit": null,
          "table_group": null
        },
        "url": {
          "type": "url",
          "source": "attribute:href",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": false,
          "unit": null,
          "table_group": null
        },
        "group": {
          "type": "text",
          "source": "rendered text",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": false,
          "unit": null,
          "table_group": null
        },
        "depth": {
          "type": "text",
          "source": "structure",
          "multivalued": false,
          "traits": [],
          "hidden": false,
          "numeric": true,
          "unit": null,
          "table_group": null
        }
      },
      "field_normalized": {
        "depth": [
          0.0,
          0.0
        ]
      },
      "label": "",
      "label_url": "",
      "merge_note": "",
      "kind": "navigation",
      "placement": "footer",
      "xpath": "/html/body/footer",
      "items_detected": 2,
      "withheld_columns": [],
      "withheld_visual": null,
      "withheld_records": 0,
      "declared_total_rows": null,
      "declared_total_columns": null,
      "structural_outliers": [],
      "markdown": "Quotes by: [GoodReads.com](https://www.goodreads.com/quotes)\n\nMade with ❤ by [Zyte](https://www.zyte.com)"
    }
  ],
  "sections": [
    {
      "type": "records",
      "structured_content_index": 0
    },
    {
      "type": "records",
      "structured_content_index": 1
    },
    {
      "type": "records",
      "structured_content_index": 2
    }
  ],
  "outline": [
    {
      "label": "",
      "kind": "item",
      "xpath": "/html/body/div",
      "fate": "extracted",
      "section_index": 0,
      "reason": "",
      "item_count": 10,
      "superseded_by": null,
      "children": [
        {
          "label": "",
          "kind": "header",
          "xpath": "/html/body/div/div[1]",
          "fate": "extracted",
          "section_index": 1,
          "reason": "",
          "item_count": 2,
          "superseded_by": null,
          "children": []
        }
      ]
    },
    {
      "label": "",
      "kind": "footer",
      "xpath": "/html/body/footer",
      "fate": "extracted",
      "section_index": 2,
      "reason": "",
      "item_count": 2,
      "superseded_by": null,
      "children": []
    }
  ],
  "document_section_plan": [
    {
      "source": "structured_content",
      "index": 0
    },
    {
      "source": "structured_content",
      "index": 1
    },
    {
      "source": "structured_content",
      "index": 2
    }
  ],
  "withheld_areas": 0,
  "subject_withheld": "below_evidence_bar",
  "warnings": [],
  "browse_actions": [],
  "mode": "auto",
  "resolved_url": "https://quotes.toscrape.com/js/",
  "document_view": {
    "patch": "KLUv/QCIXQUAiDwtYW5hbG9nLW5vZGU9ImJ5M6DQZRoDEE4IYmbED+4wRgLKaeXxsDgbKVoRBSkuLcXpm0YUOrI3spoIpQm7RFu6ZvYQTr0/Kh7KmIMA5WjRdEj3/wGKO0DDQUK6h1G+E82GMus7CAUqkNrOwZTTQZPhbOEbQH1u0WAgj1zDq0DWlPsZTLlXNBZ2BscgVXBOk0YqB2wE44XCVdhSQIiX+gVCFeOJpLqp4SQS",
    "sha256": "23d0cae2cad42487b8386bd24ba9339df82fcc098654929a95979dd37389fe01"
  },
  "pagination": {
    "current_page": 1,
    "max_page_seen": 2,
    "next_url": "https://quotes.toscrape.com/js/page/2/",
    "stated_total": null,
    "stated_total_source": null,
    "in_page_controls": false,
    "collection_confirmed": true
  },
  "page_sweep": null,
  "markdown": "# [Quotes to Scrape](https://quotes.toscrape.com/)\n\n[Login](https://quotes.toscrape.com/login)\n\n“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”by Albert Einstein\n\nTags: change deep-thoughts thinking world\n\n“It is our choices, Harry, that show what we truly are, far more than our abilities.”by J.K. Rowling\n\nTags: abilities choices\n\n“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”by Albert Einstein\n\nTags: inspirational life live miracle miracles\n\n“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”by Jane Austen\n\nTags: aliteracy books classic humor\n\n“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”by Marilyn Monroe\n\nTags: be-yourself inspirational\n\n“Try not to become a man of success. Rather become a man of value.”by Albert Einstein\n\nTags: adulthood success value\n\n“It is better to be hated for what you are than to be loved for what you are not.”by André Gide\n\nTags: life love\n\n“I have not failed. I've just found 10,000 ways that won't work.”by Thomas A. Edison\n\nTags: edison failure inspirational paraphrased\n\n“A woman is like a tea bag; you never know how strong it is until it's in hot water.”by Eleanor Roosevelt\n\nTags: misattributed-eleanor-roosevelt\n\n“A day without sunshine is like, you know, night.”by Steve Martin\n\nTags: humor obvious simile\n\n- [Next →](https://quotes.toscrape.com/js/page/2/)\n\nQuotes by: [GoodReads.com](https://www.goodreads.com/quotes)\n\nMade with ❤ by [Zyte](https://www.zyte.com)",
  "handle": "20260912-pvtqdw"
}
```

</details>





## `analog_export`

Return a saved result in another format. JSON contains the full
structured result; CSV and YAML contain pooled records; Markdown
contains the page's Markdown with any required disclosures.
The tool returns text and does not write an export file.

CSV and YAML require compatible section fields. When sections cannot
be pooled, use JSON for the whole result or
[`analog_section`](https://getanalog.io/docs/mcp-reference/#analog_section) to read one section.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
analog_export(handle: string, fmt: string = "json")
```

**Accepted values:**

- `fmt` — one of `"json"`, `"csv"`, `"yaml"`, `"md"`, `"markdown"`.
<!-- END GENERATED: mcp-tool-declaration -->



### Read the saved page as Markdown

Tool: `analog_export`

```json example=runnable tool=analog_export scenario=mcp-export-quotes
{
  "handle": "20260912-pvtqdw",
  "fmt": "md"
}
```

This is the returned Markdown text, including the quotes, tags, and
navigation. It uses the saved page rather than fetching the URL again.

<details>
<summary>View output</summary>

```text wrap=true example=output scenario=mcp-export-quotes
# [Quotes to Scrape](https://quotes.toscrape.com/)

[Login](https://quotes.toscrape.com/login)

“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”by Albert Einstein

Tags: change deep-thoughts thinking world

“It is our choices, Harry, that show what we truly are, far more than our abilities.”by J.K. Rowling

Tags: abilities choices

“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”by Albert Einstein

Tags: inspirational life live miracle miracles

“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”by Jane Austen

Tags: aliteracy books classic humor

“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”by Marilyn Monroe

Tags: be-yourself inspirational

“Try not to become a man of success. Rather become a man of value.”by Albert Einstein

Tags: adulthood success value

“It is better to be hated for what you are than to be loved for what you are not.”by André Gide

Tags: life love

“I have not failed. I've just found 10,000 ways that won't work.”by Thomas A. Edison

Tags: edison failure inspirational paraphrased

“A woman is like a tea bag; you never know how strong it is until it's in hot water.”by Eleanor Roosevelt

Tags: misattributed-eleanor-roosevelt

“A day without sunshine is like, you know, night.”by Steve Martin

Tags: humor obvious simile

- [Next →](https://quotes.toscrape.com/js/page/2/)

Quotes by: [GoodReads.com](https://www.goodreads.com/quotes)

Made with ❤ by [Zyte](https://www.zyte.com)
```

</details>





## `analog_section`

Read one section's full records and field schema. `index` is
zero-based in `structured_content`, in page order. Use the receipt,
[`analog_describe`](https://getanalog.io/docs/mcp-reference/#analog_describe), or [`analog_open`](https://getanalog.io/docs/mcp-reference/#analog_open)
to find the relevant section before choosing its index.

Section numbers belong to this save. A later fetch may organize the
page differently.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
analog_section(handle: string, index: integer)
```

**Accepted values:**

- `index` — at least 0.
<!-- END GENERATED: mcp-tool-declaration -->



### Read just the quotes

Tool: `analog_section`

```json example=runnable tool=analog_section scenario=mcp-section-quotes
{
  "handle": "20260912-pvtqdw",
  "index": 0
}
```

Section 0 contains all ten quote records and their field definitions.
The navigation sections are outside this response.

<details>
<summary>View output</summary>

```json wrap=true example=output scenario=mcp-section-quotes
{
  "records": [
    {
      "tags": [
        "change",
        "deep-thoughts",
        "thinking",
        "world"
      ],
      "text": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”",
      "text_2": "by Albert Einstein"
    },
    {
      "tags": [
        "abilities",
        "choices"
      ],
      "text": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”",
      "text_2": "by J.K. Rowling"
    },
    {
      "tags": [
        "inspirational",
        "life",
        "live",
        "miracle",
        "miracles"
      ],
      "text": "“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”",
      "text_2": "by Albert Einstein"
    },
    {
      "tags": [
        "aliteracy",
        "books",
        "classic",
        "humor"
      ],
      "text": "“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”",
      "text_2": "by Jane Austen"
    },
    {
      "tags": [
        "be-yourself",
        "inspirational"
      ],
      "text": "“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”",
      "text_2": "by Marilyn Monroe"
    },
    {
      "tags": [
        "adulthood",
        "success",
        "value"
      ],
      "text": "“Try not to become a man of success. Rather become a man of value.”",
      "text_2": "by Albert Einstein"
    },
    {
      "tags": [
        "life",
        "love"
      ],
      "text": "“It is better to be hated for what you are than to be loved for what you are not.”",
      "text_2": "by André Gide"
    },
    {
      "tags": [
        "edison",
        "failure",
        "inspirational",
        "paraphrased"
      ],
      "text": "“I have not failed. I've just found 10,000 ways that won't work.”",
      "text_2": "by Thomas A. Edison"
    },
    {
      "tags": [
        "misattributed-eleanor-roosevelt"
      ],
      "text": "“A woman is like a tea bag; you never know how strong it is until it's in hot water.”",
      "text_2": "by Eleanor Roosevelt"
    },
    {
      "tags": [
        "humor",
        "obvious",
        "simile"
      ],
      "text": "“A day without sunshine is like, you know, night.”",
      "text_2": "by Steve Martin"
    }
  ],
  "fields": {
    "tags": {
      "type": "text",
      "source": "rendered text",
      "multivalued": true,
      "traits": [],
      "hidden": false,
      "numeric": false,
      "unit": null,
      "table_group": null
    },
    "text": {
      "type": "text",
      "source": "rendered text",
      "multivalued": false,
      "traits": [],
      "hidden": false,
      "numeric": false,
      "unit": null,
      "table_group": null
    },
    "text_2": {
      "type": "text",
      "source": "rendered text",
      "multivalued": false,
      "traits": [],
      "hidden": false,
      "numeric": false,
      "unit": null,
      "table_group": null
    }
  },
  "field_normalized": {},
  "label": "",
  "label_url": "",
  "merge_note": "",
  "kind": "",
  "placement": "",
  "xpath": "/html/body/div",
  "items_detected": 10,
  "withheld_columns": [],
  "withheld_visual": null,
  "withheld_records": 0,
  "declared_total_rows": null,
  "declared_total_columns": null,
  "structural_outliers": []
}
```

</details>





## `analog_collection`

Read one collection as canonical records with their member sections.
Collections combine compatible page areas into a deduplicated dataset
while retaining where those records appeared. A collection does not
have a single physical location on the page.

`index` is zero-based in the result's `collections` list, which is
ordered by the first member section. It is separate from a section
index. Check [`analog_open`](https://getanalog.io/docs/mcp-reference/#analog_open) for available collections;
some results have none.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
analog_collection(handle: string, index: integer)
```

**Accepted values:**

- `index` — at least 0.
<!-- END GENERATED: mcp-tool-declaration -->



### Read the first reported collection

The quotes-page example has no collections. For a save that does,
replace `<handle>` with its handle and choose an index from its
`collections` list:

Tool: `analog_collection`

```json example=illustrative tool=analog_collection
{
  "handle": "<handle>",
  "index": 0
}
```

The response includes `records`, `fields`, and `section_indices`,
plus record and placement counts. Use `section_indices` with
[`analog_section`](https://getanalog.io/docs/mcp-reference/#analog_section) when you need to inspect an
individual member section.





## `analog_find`

Search saved records and Markdown sections in page order. Matching is
a case-insensitive substring search; special characters match literally.
Results include source attribution so you can return to the relevant
section.

Pass `field` to search one record field. Without it, the search covers
all record fields and Markdown sections. A field that does not exist
returns an explanatory error.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
analog_find(handle: string, pattern: string, field: string | null = null)
```
<!-- END GENERATED: mcp-tool-declaration -->



### Find the quote by Jane Austen

Tool: `analog_find`

```json example=runnable tool=analog_find scenario=mcp-find-quotes
{
  "handle": "20260912-pvtqdw",
  "pattern": "Jane Austen",
  "field": "text_2"
}
```

In this save, `text_2` contains author names. The matching record
includes its full quote and `_source` section. The text response is a
list; structured responses contain the same list under `matches`.

```json wrap=true example=output scenario=mcp-find-quotes
[
  {
    "tags": [
      "aliteracy",
      "books",
      "classic",
      "humor"
    ],
    "text": "“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”",
    "text_2": "by Jane Austen",
    "_source": "structured_content[0]"
  }
]
```





## `analog_describe`

Preview a saved result's sections and field metadata in page order.
Fields show names, types, list shapes, and non-null coverage when sparse.
Read a section or the full result for values. This tool returns a text preview.

Markdown regions appear in page order with their available labels, roles,
and rendered sizes. Read their text through `analog_open` or `analog_export`.
Printed `section[N]` identifiers keep the record indices used by
`analog_section`; prose entries do not change them.

`complete: true` includes hidden fields in the summary. By default they are
counted but not listed. It does not turn the preview into a full-result read.

`guidance: true` may add one available next action. It is off by default;
field metadata, coverage notes and necessary recovery stay the same.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
analog_describe(handle: string, complete: boolean = false, guidance: boolean = false)
```
<!-- END GENERATED: mcp-tool-declaration -->



### Get your bearings in the saved page

Tool: `analog_describe`

```json example=runnable tool=analog_describe scenario=mcp-describe-quotes
{
  "handle": "20260912-pvtqdw"
}
```

The preview locates the quotes in section 0 and identifies two
navigation sections.
[`analog_section`](https://getanalog.io/docs/mcp-reference/#analog_section) returns all ten quotes in full.

<details>
<summary>View output</summary>

```text wrap=true example=output scenario=mcp-describe-quotes
pagination: this looks like page 1 of a paginated collection (its links reach page 2) — these records cover this page only.

3 sections extracted.

section[0]  10 records · 3 fields
  fields: tags:text[], text:text, text_2:text

section[1]  navigation  2 links (header) · 4 fields
  fields: text:text, url:url, group:text, depth:text

section[2]  navigation  2 links (footer) · 4 fields
  fields: text:text, url:url, group:text, depth:text

(A single-subject record was also weighed and withheld — Analog couldn't verify enough of the page's facts for a record we'd trust.)
```

</details>





## `analog_feedback`

Send a quality report or feature request to Analog. Submitting requires
a connected account and returns a confirmation with a report ID.

For `extraction_quality`, supply the affected URL and at least one
reason label. A quality report includes the URL you explicitly submit;
it never includes page content. The optional `note` adds context.

For `feature_request`, supply a non-empty `note` and omit `url` and
`labels`. See [Feedback](https://getanalog.io/docs/feedback/) for choosing what to report.

<!-- BEGIN GENERATED: mcp-tool-declaration -->
```text wrap=true
analog_feedback(kind: string, url: string | null = null, labels: list[string] | null = null, note: string = "")
```

**Accepted values:**

- `kind` — one of `"extraction_quality"`, `"feature_request"`.
- `labels` — one of `"undetected_block"`, `"under_rendered"`, `"no_records_found"`, `"poor_field_naming"`, `"misfielded_values"`, `"page_chrome_in_records"`, `"over_extraction"`, `"under_extraction"`, `"wrong_content_extracted"`, `"garbled_markdown"`, `"other"`.
<!-- END GENERATED: mcp-tool-declaration -->



### Send a feature request

Replace the placeholder with the request you want to send:

Tool: `analog_feedback`

```json example=illustrative tool=analog_feedback
{
  "kind": "feature_request",
  "note": "<your-request>"
}
```

A successful submission returns a confirmation and an opaque report ID.



<!-- END GENERATED: mcp-tool-reference -->