Skip to main content
Glama
lmcc-dev

mult-fetch-mcp-server

by lmcc-dev

mult-fetch-mcp-server

npm version License: MIT Node.js Version TypeScript MCP SDK GitHub Stars GitHub Forks GitHub Issues GitHub Pull Requests npm downloads GitHub last commit GitHub contributors LightNow capabilities codecov CodeFactor

This project implements an MCP-compliant client and server for communication between AI assistants and external tools.

English | 中文文档

Version 2.0

Call the fetch tool with a URL. The default format is Markdown, using an HTTP fetch plus readable-article extraction. startCursor is not required.

format

What you get

markdown

Readable article as Markdown (default)

plaintext

Readable article as plain text

html

HTML markup

json

JSON document

txt

Raw response body

A normal page comes back in one response. The default budget is maxChars 100000 and maxBytes 1048576, and a cut prefers a newline or a space. When the body is longer, the response includes nextCursor and chunkId. Call fetch again with cursor set to nextCursor.

fetch_html, fetch_json, fetch_txt, fetch_markdown, and fetch_plaintext are thin aliases of fetch with a fixed format.

Cursor

Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in a project:

{
  "mcpServers": {
    "mult-fetch": {
      "command": "npx",
      "args": ["-y", "@lmcc-dev/mult-fetch-mcp-server"],
      "env": {
        "MCP_LANG": "en"
      }
    }
  }
}

Claude Desktop

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "mult-fetch": {
      "command": "npx",
      "args": ["-y", "@lmcc-dev/mult-fetch-mcp-server"],
      "env": {
        "MCP_LANG": "en"
      }
    }
  }
}

Restart the host after saving. Ask it to fetch a URL. It should call fetch without startCursor.

Browser mode

The default HTTP fetcher does not need Chrome or Puppeteer. A normal install works without them (npm install --omit=optional skips the optional packages). To render pages in a headless browser, install the optional packages and set useBrowser to true:

npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth

autoDetectMode defaults to false, so a 403 does not launch a browser unless you set that flag.

Security

Every request, including redirects, is checked before it is sent:

  • Loopback (127.0.0.0/8, ::1, localhost)

  • Private networks (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)

  • Link-local and cloud metadata (169.254.0.0/16, including 169.254.169.254, and IPv6 fe80::/10)

  • Carrier-grade NAT 100.64.0.0/10, documentation ranges, and private addresses embedded in 6to4, NAT64, or IPv4-mapped IPv6

Direct connections are pinned to the addresses that passed that check. The default timeout is 30 seconds, and each response is limited by maxChars and maxBytes. Browser mode keeps the same URL checks. Set ALLOW_PRIVATE_NETWORK_REQUESTS=true only when you intentionally want the browser to open a private-network target.

Related MCP server: Crawl4AI MCP Server

Project Structure

fetch-mcp/
├── src/                         # Source code directory
│   ├── lib/                     # Library files
│   │   ├── fetchers/            # Web fetching implementation
│   │   │   ├── browser/         # Browser-based fetching
│   │   │   │   ├── BrowserFetcher.ts      # Browser fetcher implementation
│   │   │   │   ├── BrowserInstance.ts     # Browser instance management
│   │   │   │   └── PageOperations.ts      # Page interaction operations
│   │   │   ├── node/            # Node.js-based fetching
│   │   │   └── common/          # Shared fetching utilities
│   │   ├── utils/               # Utility modules
│   │   │   ├── ChunkManager.ts        # Content chunking
│   │   │   ├── ContentProcessor.ts    # HTML to text conversion
│   │   │   ├── ContentExtractor.ts    # Intelligent content extraction
│   │   │   ├── ContentSizeManager.ts  # Content size limiting
│   │   │   └── ErrorHandler.ts        # Error handling
│   │   ├── server/              # Server-related modules
│   │   │   ├── index.ts         # Server entry
│   │   │   ├── browser.ts       # Browser management
│   │   │   ├── fetcher.ts       # Web fetching logic
│   │   │   ├── tools.ts         # Tool registration and handling
│   │   │   ├── resources.ts     # Resource handling
│   │   │   ├── prompts.ts       # Prompt templates
│   │   │   └── types.ts         # Server type definitions
│   │   ├── i18n/                # Internationalization support
│   │   └── types.ts             # Common type definitions
│   ├── client.ts                # MCP client implementation
│   └── mcp-server.ts            # MCP server main entry
├── index.ts                     # Server entry point
├── tests/                       # Test files
└── dist/                        # Compiled files

MCP Specification

The Model Context Protocol (MCP) defines two main transport methods:

  1. Standard Input/Output (Stdio): The client starts the MCP server as a child process, and they communicate through standard input (stdin) and standard output (stdout).

  2. Server-Sent Events (SSE): Used to pass messages between client and server.

This project implements the Standard Input/Output (Stdio) transport method.

Features

  • Implementation based on the official MCP SDK

  • Support for Standard Input/Output (Stdio) transport

  • One fetch tool with format set to HTML, JSON, text, Markdown, or plain text

  • HTTP fetch by default, with optional headless-browser rendering

  • Single-response content window (maxChars / maxBytes) and optional cursor continuation when the body is truncated

  • Detailed debug logging to stderr

  • Bilingual internationalization (English and Chinese)

  • Modular design for easy maintenance and extension

  • Intelligent Content Extraction: Based on Mozilla's Readability library, capable of extracting meaningful content from web pages while filtering out advertisements and navigation elements

  • Metadata Support: Ability to extract webpage metadata such as title, author, publication date, and site information

  • Smart Content Detection: Automatically detects if a page contains meaningful content, filtering out login pages, error pages, and other pages without substantial content

  • Browser Automation Enhancements: Support for page scrolling, cookie management, selector waiting, and other advanced browser interactions

Installation

Installing via Smithery

To install Mult Fetch MCP Server for Claude Desktop automatically via Smithery:

npx -y @smithery/cli install @lmcc-dev/mult-fetch-mcp-server --client claude

Local Installation

pnpm install

Global Installation

pnpm add -g @lmcc-dev/mult-fetch-mcp-server

Or run directly with npx (no installation required):

npx @lmcc-dev/mult-fetch-mcp-server

Integration with Claude

To integrate this tool with Claude desktop, you need to add server configuration:

Configuration File Location

  • MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%/Claude/claude_desktop_config.json

Configuration Examples

This method is the simplest, doesn't require specifying the full path, and is suitable for global installation or direct use with npx:

{
  "mcpServers": {
    "mult-fetch-mcp-server": {
      "command": "npx",
      "args": ["@lmcc-dev/mult-fetch-mcp-server"],
      "env": {
        "MCP_LANG": "en"  // Set language to English, options: "zh" or "en"
      }
    }
  }
}

Method 2: Specifying Full Path

If you need to use a specific installation location, you can specify the full path:

{
  "mcpServers": {
    "mult-fetch-mcp-server": {
      "command": "path-to/bin/node",
      "args": ["path-to/@lmcc-dev/mult-fetch-mcp-server/dist/index.js"],
      "env": {
        "MCP_LANG": "en"  // Set language to English, options: "zh" or "en"
      }
    }
  }
}

Please replace path-to/bin/node with the path to the Node.js executable on your system, and replace path-to/@lmcc-dev/mult-fetch-mcp-server with the actual path to this project.

Usage Examples

Below is an example of using this tool in Claude desktop client:

Claude Desktop Client Example

The image shows how Claude can use the fetch tools to retrieve web content and process it according to your instructions.

Usage

After configuration, restart Claude desktop, and you can use the following tools in your conversation:

  • fetch: Fetch a URL. Set format to html, markdown (default), plaintext, json, or txt

  • fetch_html, fetch_json, fetch_txt, fetch_markdown, fetch_plaintext: aliases of fetch kept from 1.x

Build

pnpm run build

Run Server

pnpm run server
# or
node dist/index.js
# if globally installed, you can run directly
@lmcc-dev/mult-fetch-mcp-server
# or use npx
npx @lmcc-dev/mult-fetch-mcp-server

Client Demo Tools

Note: The following client.js functionality is provided for demonstration and testing purposes only. When used with Claude or other AI assistants, the MCP server is driven by the AI, which manages the chunking process automatically.

Command Line Client

The project includes a command-line client for testing and development purposes:

pnpm run client <method> <params_json>
# example
pnpm run client fetch_html '{"url": "https://example.com", "debug": true}'

Demo Client Chunk Control Parameters

When testing with the command-line client, you can use these parameters to demonstrate content chunking capabilities:

  • --all-chunks: Command line flag to automatically fetch all chunks in sequence (demonstration purpose only)

  • --max-chunks: Command line flag to limit the maximum number of chunks to fetch (optional, default is 10)

Real-time Output Demo

The client.js demo tool provides real-time output capabilities:

node dist/src/client.js fetch_html '{"url":"https://example.com", "startCursor": 0, "contentSizeLimit": 500}' --all-chunks --debug

The demo client will automatically fetch all chunks in sequence and display them immediately, showcasing how large content can be processed in real-time.

Run Tests

# Run MCP functionality tests
npm run test:mcp

# Run mini4k.com website tests
npm run test:mini4k

# Run direct client call tests
npm run test:direct

Language Settings

This project supports Chinese and English bilingual internationalization. You can set the language using environment variables:

Using Environment Variables

Set the MCP_LANG environment variable to control the language:

# Set to English
export MCP_LANG=en
npm run server

# Set to Chinese
export MCP_LANG=zh
npm run server

# Windows system
set MCP_LANG=zh
npm run server

Using environment variables ensures that all related processes (including the MCP server) use the same language settings.

Default Language

By default, the system will choose a language according to the following priority:

  1. MCP_LANG environment variable

  2. Operating system language (if it starts with "zh", use Chinese)

  3. English (as the final fallback option)

Debugging

This project follows the MCP protocol specification and does not output any logs by default to avoid interfering with JSON-RPC communication. Debug information is controlled through call parameters:

Using the debug Parameter

Set the debug: true parameter when calling a tool:

{
  "url": "https://example.com",
  "debug": true
}

Debug messages are sent to the standard error stream (stderr) using the following format:

[MCP-SERVER] MCP server starting...
[CLIENT] Fetching URL: https://example.com

Debug Log File

When debug mode is enabled, all debug messages are also written to a log file located at:

~/.mult-fetch-mcp-server/debug.log

This log file can be accessed through the MCP resources API:

// Access the debug log file
const result = await client.readResource({ uri: "file:///logs/debug" });
console.log(result.contents[0].text);

// Clear the debug log file
const clearResult = await client.readResource({ uri: "file:///logs/clear" });
console.log(clearResult.contents[0].text);

Proxy Settings

This tool supports various methods to configure proxy settings:

1. Using the proxy Parameter

The most direct way is to specify the proxy in the request parameters:

{
  "url": "https://example.com",
  "proxy": "http://your-proxy-server:port",
  "debug": true
}

2. Using Environment Variables

The tool will automatically detect and use proxy settings from standard environment variables:

# Set proxy environment variables
export HTTP_PROXY=http://your-proxy-server:port
export HTTPS_PROXY=http://your-proxy-server:port

# Run the server
npm run server

3. System Proxy Detection

The tool attempts to detect system proxy settings based on your operating system:

  • Windows: Reads proxy settings from environment variables using the set command

  • macOS/Linux: Reads proxy settings from environment variables using the env command

4. Proxy Troubleshooting

If you're having issues with proxy detection:

  1. Use the debug: true parameter to see detailed logs about proxy detection

  2. Explicitly specify the proxy using the proxy parameter

  3. Ensure your proxy URL is in the correct format: http://host:port or https://host:port

  4. For websites that require browser capabilities, set useBrowser: true to use browser mode

5. Browser Mode and Proxies

When using browser mode (useBrowser: true), the tool will:

  1. First try to use the explicitly specified proxy (if provided)

  2. Then try to use system proxy settings

  3. Finally, proceed without a proxy if none is found

Browser mode is particularly useful for websites that implement anti-scraping measures or require JavaScript execution.

Parameter Handling

This project handles parameters in the following ways:

  • debug: Passed through call parameters, each request can individually control whether to enable debug output

  • MCP_LANG: Retrieved from environment variables, controls the language settings of the entire server

Usage

Creating a Client

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import path from 'path';
import { fileURLToPath } from 'url';

// Get the directory path of the current file
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// Create client transport layer
const transport = new StdioClientTransport({
  command: 'node',
  args: [path.resolve(__dirname, 'dist/index.js')],
  stderr: 'inherit',
  env: {
    ...process.env  // Pass all environment variables, including MCP_LANG
  }
});

// Create client
const client = new Client({
  name: "example-client",
  version: "1.0.0"
});

// Connect to transport layer
await client.connect(transport);

// Use client
const result = await client.callTool({
  name: 'fetch_html',
  arguments: {
    url: 'https://example.com',
    debug: true  // Control debug output through parameters
  }
});

if (result.isError) {
  console.error('Fetch failed:', result.content[0].text);
} else {
  console.log('Fetch successful!');
  console.log('Content preview:', result.content[0].text.substring(0, 500));
}

Supported Tools

  • fetch: Fetch a URL. format is html, markdown (default), plaintext, json, or txt

  • fetch_html, fetch_json, fetch_txt, fetch_markdown, fetch_plaintext: 1.x aliases of fetch

Resources Support

The server includes support for the resources/list and resources/read methods, but currently no resources are defined in the implementation. The resource system is designed to provide access to project files and documentation, but this feature is not fully implemented yet.

Resource Usage Example

// Example: List available resources
const resourcesResult = await client.listResources({});
console.log('Available resources:', resourcesResult);

// Note: Currently this will return empty lists for resources and resourceTemplates

Supported Prompt Templates

The server provides the following prompt templates:

  • fetch-website: Get website content, supporting different formats and browser mode

  • extract-content: Extract specific content from a website, supporting CSS selectors and data type specification

  • debug-fetch: Debug website fetching issues, analyze possible causes and provide solutions

Prompt Template Usage

  1. Use prompts/list to get a list of available prompt templates

  2. Use prompts/get to get specific prompt template content

// Example: List available prompt templates
const promptsResult = await client.listPrompts({});
console.log('Available prompts:', promptsResult);

// Example: Get website content prompt
const fetchPrompt = await client.getPrompt({
  name: "fetch-website",
  arguments: {
    url: "https://example.com",
    format: "html",
    useBrowser: "false"
  }
});
console.log('Fetch website prompt:', fetchPrompt);

// Example: Debug website fetching issues
const debugPrompt = await client.getPrompt({
  name: "debug-fetch",
  arguments: {
    url: "https://example.com",
    error: "Connection timeout"
  }
});
console.log('Debug fetch prompt:', debugPrompt);

Parameter Options

Each tool supports the following parameters:

Basic Parameters

  • url: URL to fetch (required)

  • headers: Custom request headers (optional, default {})

  • proxy: Proxy server URL in the format http://host:port or https://host:port (optional)

Network Control Parameters

  • timeout: Timeout in milliseconds (optional, default is 30000)

  • maxRedirects: Maximum number of redirects to follow (optional, default is 10)

  • noDelay: Whether to disable random delay between requests (optional, default is false)

  • useSystemProxy: Whether to use system proxy (optional, default is true)

Content Window

  • maxChars: Maximum characters in this response (optional, default 100000). The cut prefers a newline or space.

  • maxBytes: Maximum UTF-8 bytes in this response (optional, default 1048576).

  • cursor: Continuation token from nextCursor. Omit it on the first call. When it is set, the server does not refetch the URL.

  • enableContentSplitting: When false, oversized content is truncated with no cursor (optional, default true).

  • contentSizeLimit: Legacy byte-chunk size. When set without maxChars or maxBytes, the 1.x byte splitter is used.

  • startCursor: Legacy byte offset. Not required. Use it only with a 1.x chunkId.

Chunk Management

  • chunkId: Document id returned with nextCursor when a response was truncated.

Pass cursor back to fetch to read the next slice. startCursor is not part of that flow.

Mode Control Parameters

  • useBrowser: Whether to use browser mode (optional, default is false)

  • useNodeFetch: Whether to force using Node.js mode (optional, default is false, mutually exclusive with useBrowser)

  • autoDetectMode: Retry a 403 or challenge page in the browser (optional, default false). Requires the optional Puppeteer packages.

Browser Mode Specific Parameters

  • waitForSelector: Selector to wait for in browser mode (optional, default is 'body')

  • waitForTimeout: Timeout to wait in browser mode in milliseconds (optional, default is 5000)

  • scrollToBottom: Whether to scroll to the bottom of the page in browser mode (optional, default is false)

  • saveCookies: Whether to save cookies in browser mode (optional, default is true)

  • closeBrowser: Whether to close the browser instance (optional, default is false)

Content Extraction Parameters

  • extractContent: Use Readability before conversion (optional). Default true for markdown and plaintext, false for html, json, and txt.

  • includeMetadata: Whether to include metadata in the extracted content (optional, default false, only works when extractContent is true)

  • fallbackToOriginal: Whether to fall back to the original content when extraction fails (optional, default true, only works when extractContent is true)

Debug Parameters

  • debug: Whether to enable debug output (optional, default false)

Content Extraction Feature

Use the content extraction feature to get the core content of a webpage, filtering out navigation bars, advertisements, sidebars, and other distracting elements:

{
  "url": "https://example.com/article",
  "extractContent": true,
  "includeMetadata": true
}

The extracted content will include the following metadata (if available):

  • Title

  • Byline (author)

  • Site name

  • Excerpt

  • Content length

  • Readability flag (isReaderable)

Special Usage

Content Extraction Examples

To extract only the meaningful content from an article webpage:

{
  "url": "https://example.com/news/article",
  "extractContent": true,
  "includeMetadata": true
}

For websites where content extraction might fail, you can use fallbackToOriginal to ensure you get some content:

{
  "url": "https://example.com/complex-layout",
  "extractContent": true,
  "fallbackToOriginal": true
}

Closing Browser Without Fetching

To close the browser instance without performing any fetch operation:

{
  "url": "about:blank",
  "closeBrowser": true
}

Proxy Priority

The proxy is determined in the following order:

  1. Command line specified proxy

  2. proxy parameter in the request

  3. Environment variables (if useSystemProxy is true)

  4. Git configuration (if useSystemProxy is true)

If proxy is set, useSystemProxy will be automatically set to false.

Debug Output

When debug: true is set, logs will be output to stderr with the following prefixes:

  • [MCP-SERVER]: Logs from the MCP server

  • [NODE-FETCH]: Logs from the Node.js fetcher

  • [BROWSER-FETCH]: Logs from the browser fetcher

  • [CLIENT]: Logs from the client

  • [TOOLS]: Logs from the tool implementation

  • [FETCHER]: Logs from the main fetcher interface

  • [CONTENT]: Logs related to content handling

  • [CONTENT-PROCESSOR]: Logs from the HTML content processor

  • [CONTENT-SIZE]: Logs related to content size management

  • [CHUNK-MANAGER]: Logs related to content chunking operations

  • [ERROR-HANDLER]: Logs related to error handling

  • [BROWSER-MANAGER]: Logs from the browser instance manager

  • [CONTENT-EXTRACTOR]: Logs from the content extractor

License

MIT


Updated by lmcc-dev

Available Tools

6 tools
fetchA

Fetch an http(s) URL and return its content in one response. Use this to read a web page or a JSON/text URL. Default format is markdown with readable-article extraction. Do not send startCursor. Parameters that matter: url (required on the first call), format (html | markdown | plaintext | json | txt, default markdown). Optional: maxChars (default 100000), maxBytes (default 1048576), timeout (default 30000). If the response is truncated it includes nextCursor and chunkId; call fetch again with that cursor to continue. Private, loopback, and link-local targets are blocked. Browser rendering is off unless useBrowser or autoDetectMode is true.

NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response.
debugNoWrite debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics.
proxyNoOptional proxy URL (http://host:port or https://host:port).
cursorNoContinuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.
formatNoOutput format. markdown (default) and plaintext extract readable content over HTTP. html returns markup. json expects a JSON document. txt returns the raw body.
chunkIdNoLegacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor.
headersNoOptional request headers as a string-to-string map.
noDelayNoSkip the random delay between redirects. Default: false.
timeoutNoRequest timeout in milliseconds. Default: 30000.
maxBytesNoMaximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.
maxCharsNoMaximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.
useBrowserNoUse the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches.
saveCookiesNoKeep cookies for the same site across browser-mode calls. Default: true.
startCursorNoLegacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation.
closeBrowserNoClose the browser after this call. Default: false.
maxRedirectsNoMaximum redirects to follow. Default: 10. Each redirect is checked for SSRF.
autoDetectModeNoRetry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed.
extractContentNoExtract the main article with Readability before converting. Default: true for markdown and plaintext, false for html, json, and txt.
scrollToBottomNoScroll to the bottom before reading the page in browser mode. Default: false.
useSystemProxyNoUse HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true.
waitForTimeoutNoExtra wait after load in browser mode, in milliseconds. Default: 5000.
includeMetadataNoInclude title, byline, and site name when extractContent is true. Default: true.
waitForSelectorNoCSS selector to wait for in browser mode.
contentSizeLimitNoLegacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars.
fallbackToOriginalNoIf Readability finds no article, convert the original document. Default: true.
enableContentSplittingNoWhen false, oversized content is truncated with no continuation cursor. Default: true.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does substantial work: it discloses truncation semantics (nextCursor/chunkId returned on truncation, re-call with the cursor), an SSRF safety boundary ('Private, loopback, and link-local targets are blocked'), the default-off browser rendering, and the default extraction mode. It does not mention rate limiting, retry behavior on non-403 failures, or what the response envelope looks like beyond 'content', which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and default behavior before parameters, which is the right order for an agent skimming. It is dense but every clause is functional; the only waste is mild duplication between 'Default format is markdown' and the later 'format (... default markdown)' enumeration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 26-parameter tool with no annotations and no output schema, the description covers the main fetch path, pagination continuation, safety blocking, and the browser-mode toggle, which is enough to call it correctly on a normal request. The notable gaps are the relationship to the five format-specific siblings and any description of the response envelope beyond raw content, both of which an agent would have to discover by trial.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3 and the schema already documents every one of the 26 properties. The description earns extra credit by triaging that surface for the agent ('Parameters that matter: url ... format ...', then optional maxChars/maxBytes/timeout with defaults) and by flagging the cursor continuation protocol as the alternative to url. It still repeats defaults that the schema already states verbatim, so it stops short of 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a specific verb and resource ('Fetch an http(s) URL') plus the output contract ('return its content in one response'), and the second sentence names the concrete use case (read a web page or a JSON/text URL). It never mentions the format-specific siblings (fetch_html, fetch_json, fetch_txt, fetch_markdown, fetch_plaintext), so an agent cannot tell from the description alone why it should call this multiplexed tool instead of one of them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied rather than stated: 'Use this to read a web page or a JSON/text URL' covers the general case, and 'Do not send startCursor' plus 'Browser rendering is off unless useBrowser or autoDetectMode is true' give two explicit exclusions. There is no guidance on when to prefer this tool over the five sibling fetchers, and no prerequisites (auth, proxy setup) are described, leaving the routing decision to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_htmlA

Deprecated alias of fetch with format="html". Returns HTML. Prefer the fetch tool. startCursor is not required.

NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response.
debugNoWrite debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics.
proxyNoOptional proxy URL (http://host:port or https://host:port).
cursorNoContinuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.
chunkIdNoLegacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor.
headersNoOptional request headers as a string-to-string map.
noDelayNoSkip the random delay between redirects. Default: false.
timeoutNoRequest timeout in milliseconds. Default: 30000.
maxBytesNoMaximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.
maxCharsNoMaximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.
useBrowserNoUse the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches.
saveCookiesNoKeep cookies for the same site across browser-mode calls. Default: true.
startCursorNoLegacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation.
closeBrowserNoClose the browser after this call. Default: false.
maxRedirectsNoMaximum redirects to follow. Default: 10. Each redirect is checked for SSRF.
autoDetectModeNoRetry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed.
extractContentNoExtract the main article with Readability before converting. Default: true for markdown and plaintext, false for html, json, and txt.
scrollToBottomNoScroll to the bottom before reading the page in browser mode. Default: false.
useSystemProxyNoUse HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true.
waitForTimeoutNoExtra wait after load in browser mode, in milliseconds. Default: 5000.
includeMetadataNoInclude title, byline, and site name when extractContent is true. Default: true.
waitForSelectorNoCSS selector to wait for in browser mode.
contentSizeLimitNoLegacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars.
fallbackToOriginalNoIf Readability finds no article, convert the original document. Default: true.
enableContentSplittingNoWhen false, oversized content is truncated with no continuation cursor. Default: true.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden. It discloses the two facts that matter most here — deprecation status and that it is an alias delegating to `fetch` — but says nothing about error behavior, redirects, SSRF checks, or how truncation/continuation works, all of which live only in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the deprecation notice and the redirect to `fetch` — the two things an agent must see first. "Returns HTML" is slightly redundant with format="html", a minor cost only.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 25-parameter, annotation-free tool the description is thin, but it deliberately delegates that complexity to `fetch`, which is a defensible strategy for a deprecated alias. An agent that ignores the redirect would still be under-informed about most parameters, so it is adequate rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% across 25 parameters, so the schema already documents every field in detail. The description's only parameter remark ("startCursor is not required") duplicates the schema's own wording, so it adds no meaning beyond the structured data; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource implicitly (fetch, HTML) and frames the tool precisely as a deprecated alias of `fetch` with format="html", which distinguishes it from fetch_json, fetch_txt, fetch_markdown and fetch_plaintext. An agent can identify it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Prefer the fetch tool" gives an explicit alternative and the condition that selects it, which is exactly the right guidance for a deprecated alias. It does not say when this tool would still be the correct choice (e.g. pinned legacy callers), but the routing intent is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_jsonA

Deprecated alias of fetch with format="json". Returns a JSON document. Prefer the fetch tool. startCursor is not required.

NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response.
debugNoWrite debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics.
proxyNoOptional proxy URL (http://host:port or https://host:port).
cursorNoContinuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.
chunkIdNoLegacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor.
headersNoOptional request headers as a string-to-string map.
noDelayNoSkip the random delay between redirects. Default: false.
timeoutNoRequest timeout in milliseconds. Default: 30000.
maxBytesNoMaximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.
maxCharsNoMaximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.
useBrowserNoUse the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches.
saveCookiesNoKeep cookies for the same site across browser-mode calls. Default: true.
startCursorNoLegacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation.
closeBrowserNoClose the browser after this call. Default: false.
maxRedirectsNoMaximum redirects to follow. Default: 10. Each redirect is checked for SSRF.
autoDetectModeNoRetry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed.
scrollToBottomNoScroll to the bottom before reading the page in browser mode. Default: false.
useSystemProxyNoUse HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true.
waitForTimeoutNoExtra wait after load in browser mode, in milliseconds. Default: 5000.
waitForSelectorNoCSS selector to wait for in browser mode.
contentSizeLimitNoLegacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars.
enableContentSplittingNoWhen false, oversized content is truncated with no continuation cursor. Default: true.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden. It discloses deprecation and the return format, which is valuable, but says nothing about truncation/continuation behavior, error handling, SSRF checks or the browser-mode side effects that the 22 parameters imply; the 'startCursor is not required' note only restates the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the deprecation notice and the routing advice, which is the right order. The trailing 'startCursor is not required' is redundant with the schema and could be dropped, but overall there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 22-parameter tool with no annotations and no output schema, the description is thin, but its practical job is routing agents away from a deprecated alias and it does that completely. It leaves unexplained what the returned JSON document looks like on errors or partial/truncated responses, which is a real gap given no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 22 parameters are already documented in the input schema, including the legacy startCursor caveat. The description's single parameter remark ('startCursor is not required') duplicates rather than adds meaning, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact operation (an alias of fetch with format="json"), states the return type (a JSON document), and explicitly declares its deprecated status, so an agent can immediately distinguish it from fetch, fetch_html, fetch_txt and the other siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an unambiguous routing instruction: 'Prefer the fetch tool.' That is an explicit when-not-to-use-this-tool statement naming the alternative, which is exactly what an agent needs to avoid selecting a deprecated alias.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_markdownA

Deprecated alias of fetch with format="markdown". Returns Markdown. Prefer the fetch tool. startCursor is not required.

NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response.
debugNoWrite debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics.
proxyNoOptional proxy URL (http://host:port or https://host:port).
cursorNoContinuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.
chunkIdNoLegacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor.
headersNoOptional request headers as a string-to-string map.
noDelayNoSkip the random delay between redirects. Default: false.
timeoutNoRequest timeout in milliseconds. Default: 30000.
maxBytesNoMaximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.
maxCharsNoMaximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.
useBrowserNoUse the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches.
saveCookiesNoKeep cookies for the same site across browser-mode calls. Default: true.
startCursorNoLegacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation.
closeBrowserNoClose the browser after this call. Default: false.
maxRedirectsNoMaximum redirects to follow. Default: 10. Each redirect is checked for SSRF.
autoDetectModeNoRetry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed.
extractContentNoExtract the main article with Readability before converting. Default: true for markdown and plaintext, false for html, json, and txt.
scrollToBottomNoScroll to the bottom before reading the page in browser mode. Default: false.
useSystemProxyNoUse HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true.
waitForTimeoutNoExtra wait after load in browser mode, in milliseconds. Default: 5000.
includeMetadataNoInclude title, byline, and site name when extractContent is true. Default: true.
waitForSelectorNoCSS selector to wait for in browser mode.
contentSizeLimitNoLegacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars.
fallbackToOriginalNoIf Readability finds no article, convert the original document. Default: true.
enableContentSplittingNoWhen false, oversized content is truncated with no continuation cursor. Default: true.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden, and for a 25-parameter network fetch it says very little: no mention of truncation/continuation behavior, redirects, SSRF checks, or browser fallback. It does add genuine behavioral context by flagging deprecation and clarifying that startCursor is not required, which prevents a common misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, no filler, with the most decision-relevant information (deprecation and the preferred alternative) front-loaded. Nothing could be removed without losing routing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a deprecated alias whose correct outcome is that the agent goes to fetch instead, the description is sufficient: it names the equivalent, names the replacement, and clears up the one legacy parameter an agent might wrongly supply. The lack of any return-value or pagination note is acceptable given it explicitly defers to fetch.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and every one of the 25 parameters has a substantive inline description, so the schema does the heavy lifting. The description's only parameter-level contribution is the note that startCursor is unnecessary, which merely restates what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool is ("Deprecated alias of fetch with format=\"markdown\"") and what it produces ("Returns Markdown"), which is enough for an agent to identify it against siblings like fetch_html or fetch_json. It is clear but framed as an identity statement for a deprecated shim rather than a full verb+resource explanation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Prefer the fetch tool" gives an explicit, decisive routing instruction away from this tool, which is the main usage decision an agent faces. It stops short of stating any condition under which this alias would still be the right choice (e.g., legacy client compatibility), but the guidance is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_plaintextA

Deprecated alias of fetch with format="plaintext". Returns plain text extracted from HTML. Prefer the fetch tool. startCursor is not required.

NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response.
debugNoWrite debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics.
proxyNoOptional proxy URL (http://host:port or https://host:port).
cursorNoContinuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.
chunkIdNoLegacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor.
headersNoOptional request headers as a string-to-string map.
noDelayNoSkip the random delay between redirects. Default: false.
timeoutNoRequest timeout in milliseconds. Default: 30000.
maxBytesNoMaximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.
maxCharsNoMaximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.
useBrowserNoUse the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches.
saveCookiesNoKeep cookies for the same site across browser-mode calls. Default: true.
startCursorNoLegacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation.
closeBrowserNoClose the browser after this call. Default: false.
maxRedirectsNoMaximum redirects to follow. Default: 10. Each redirect is checked for SSRF.
autoDetectModeNoRetry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed.
extractContentNoExtract the main article with Readability before converting. Default: true for markdown and plaintext, false for html, json, and txt.
scrollToBottomNoScroll to the bottom before reading the page in browser mode. Default: false.
useSystemProxyNoUse HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true.
waitForTimeoutNoExtra wait after load in browser mode, in milliseconds. Default: 5000.
includeMetadataNoInclude title, byline, and site name when extractContent is true. Default: true.
waitForSelectorNoCSS selector to wait for in browser mode.
contentSizeLimitNoLegacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars.
fallbackToOriginalNoIf Readability finds no article, convert the original document. Default: true.
enableContentSplittingNoWhen false, oversized content is truncated with no continuation cursor. Default: true.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden; it discloses the key behavioral facts (deprecated alias, plaintext extraction from HTML, optional legacy cursor param). It does not discuss browser mode, cookie retention, redirect/SSRF handling, or truncation cursors, but those are documented per-parameter in a 100%-covered schema, which offsets the gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, deprecation front-loaded, and the replacement named immediately. Nothing in it is redundant or padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a deprecated alias the brevity is defensible, and the redirect to 'fetch' covers the main decision. However, with 25 parameters, no annotations, and no output schema, the description does not confirm whether these parameters behave identically to 'fetch' or which ones are inert in the alias, leaving some ambiguity for an agent that must still call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every one of the 25 parameters is already documented. The description only clarifies that startCursor is optional, which the schema already states, and adds no further meaning about the legacy chunkId pairing or which params matter in plaintext mode.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource plus the exact equivalence ('deprecated alias of fetch with format="plaintext"') and the return shape ('plain text extracted from HTML'). It also names the sibling to use instead, so an agent can distinguish it from fetch_html, fetch_json, fetch_txt, and fetch_markdown without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly marks the tool as deprecated and routes the agent to the 'fetch' tool, which is the clearest possible when-not-to-use signal. It also resolves the one likely call-site question by noting 'startCursor is not required'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_txtA

Deprecated alias of fetch with format="txt". Returns the raw response body. Prefer the fetch tool. startCursor is not required.

NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response.
debugNoWrite debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics.
proxyNoOptional proxy URL (http://host:port or https://host:port).
cursorNoContinuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.
chunkIdNoLegacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor.
headersNoOptional request headers as a string-to-string map.
noDelayNoSkip the random delay between redirects. Default: false.
timeoutNoRequest timeout in milliseconds. Default: 30000.
maxBytesNoMaximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.
maxCharsNoMaximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.
useBrowserNoUse the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches.
saveCookiesNoKeep cookies for the same site across browser-mode calls. Default: true.
startCursorNoLegacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation.
closeBrowserNoClose the browser after this call. Default: false.
maxRedirectsNoMaximum redirects to follow. Default: 10. Each redirect is checked for SSRF.
autoDetectModeNoRetry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed.
scrollToBottomNoScroll to the bottom before reading the page in browser mode. Default: false.
useSystemProxyNoUse HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true.
waitForTimeoutNoExtra wait after load in browser mode, in milliseconds. Default: 5000.
waitForSelectorNoCSS selector to wait for in browser mode.
contentSizeLimitNoLegacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars.
enableContentSplittingNoWhen false, oversized content is truncated with no continuation cursor. Default: true.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden. It usefully discloses deprecation status and that the raw body is returned, but says nothing about truncation/continuation behavior, browser-mode side effects, cookie retention, or the SSRF/redirect checking that the 22-parameter surface implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, no filler, with the deprecation warning front-loaded before the behavioral note and the migration pointer. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 22-parameter tool with no annotations and no output schema, the description does the minimum: it establishes deprecation and return format, and the rich per-parameter schema descriptions cover the rest of the mechanics. However, it does not surface the cursor/chunk continuation model or browser-mode prerequisites at the top level, which an agent must piece together from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The only parameter remark in the description (startCursor not required) merely restates what the schema already says verbatim ("Not required. Do not send this for a normal fetch"), adding no new meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Deprecated alias of fetch with format=\"txt\"" names the exact operation and its relationship to the canonical sibling, and "Returns the raw response body" pins down the output shape. An agent can distinguish this from fetch, fetch_html, fetch_plaintext, and fetch_markdown without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description contains an explicit routing instruction: "Prefer the fetch tool", plus a targeted caveat that startCursor is not required. That covers both the when-to-use (effectively never, except for legacy callers) and the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv2.0.0
    • Addedfetch
    • Changedfetch_html26 fields changed
      • changedInput schema / properties / autoDetectMode / description
        Previous value: -"Optional flag to automatically switch to browser mode if standard fetch fails (default: true). Set to false to strictly use the specified mode without automatic switching."New value: +"Retry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed."
      • changedInput schema / properties / chunkId / description
        Previous value: -"Optional chunk ID for retrieving a specific chunk of content from a previous request. The system adds prompts in the format === SYSTEM NOTE === ... =================== which AI models should ignore when processing the content."New value: +"Legacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor."
      • changedInput schema / properties / closeBrowser / description
        Previous value: -"Optional flag to close the browser after fetching (default: false)"New value: +"Close the browser after this call. Default: false."
      • changedInput schema / properties / contentSizeLimit / description
        Previous value: -"Optional maximum content size in bytes before splitting into chunks (default: 50KB). Set between 20KB-50KB for optimal results. For large content, prefer smaller values (20KB-30KB) to avoid truncation."New value: +"Legacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars."
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Continuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.",
        +  "type": "string"
        +}
      • changedInput schema / properties / debug / description
        Previous value: -"Optional flag to enable detailed debug logging (default: false)"New value: +"Write debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics."
      • changedInput schema / properties / enableContentSplitting / description
        Previous value: -"Optional flag to enable content splitting for large responses (default: true)"New value: +"When false, oversized content is truncated with no continuation cursor. Default: true."
      • changedInput schema / properties / extractContent / description
        Previous value: -"Optional flag to enable intelligent content extraction using Readability algorithm (default: false). Extracts main article content from web pages."New value: +"Extract the main article with Readability before converting. Default: true for markdown and plaintext, false for html, json, and txt."
      • changedInput schema / properties / fallbackToOriginal / description
        Previous value: -"Optional flag to fall back to the original content when extraction fails (default: true). Only works when extractContent is true."New value: +"If Readability finds no article, convert the original document. Default: true."
      • changedInput schema / properties / headers / description
        Previous value: -"Optional headers to include in the request"New value: +"Optional request headers as a string-to-string map."
      • changedInput schema / properties / includeMetadata / description
        Previous value: -"Optional flag to include metadata (title, author, etc.) in the extracted content (default: false). Only works when extractContent is true."New value: +"Include title, byline, and site name when extractContent is true. Default: true."
      • addedInput schema / properties / maxBytes
        Added value: +{
        +  "description": "Maximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.",
        +  "type": "number"
        +}
      • addedInput schema / properties / maxChars
        Added value: +{
        +  "description": "Maximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.",
        +  "type": "number"
        +}
      • changedInput schema / properties / maxRedirects / description
        Previous value: -"Optional maximum number of redirects to follow (default: 10)"New value: +"Maximum redirects to follow. Default: 10. Each redirect is checked for SSRF."
      • changedInput schema / properties / noDelay / description
        Previous value: -"Optional flag to disable random delay between requests (default: false)"New value: +"Skip the random delay between redirects. Default: false."
      • changedInput schema / properties / proxy / description
        Previous value: -"Optional proxy server to use (format: http://host:port or https://host:port)"New value: +"Optional proxy URL (http://host:port or https://host:port)."
      • changedInput schema / properties / saveCookies / description
        Previous value: -"Optional flag to save cookies for future requests to the same domain (default: true)"New value: +"Keep cookies for the same site across browser-mode calls. Default: true."
      • changedInput schema / properties / scrollToBottom / description
        Previous value: -"Optional flag to scroll to bottom of page in browser mode (default: false)"New value: +"Scroll to the bottom before reading the page in browser mode. Default: false."
      • changedInput schema / properties / startCursor / description
        Previous value: -"Starting cursor position in bytes. Set to 0 for initial requests, and use the value from previous responses for subsequent requests to resume content retrieval."New value: +"Legacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation."
      • changedInput schema / properties / timeout / description
        Previous value: -"Optional timeout in milliseconds (default: 30000)"New value: +"Request timeout in milliseconds. Default: 30000."
      • changedInput schema / properties / url / description
        Previous value: -"URL of the website to fetch"New value: +"Absolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response."
      • changedInput schema / properties / useBrowser / description
        Previous value: -"Optional flag to use headless browser for fetching (default: false)"New value: +"Use the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches."
      • changedInput schema / properties / useSystemProxy / description
        Previous value: -"Optional flag to use system proxy environment variables (default: true)"New value: +"Use HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true."
      • changedInput schema / properties / waitForSelector / description
        Previous value: -"Optional CSS selector to wait for when using browser mode"New value: +"CSS selector to wait for in browser mode."
      • changedInput schema / properties / waitForTimeout / description
        Previous value: -"Optional timeout to wait after page load in browser mode (default: 5000)"New value: +"Extra wait after load in browser mode, in milliseconds. Default: 5000."
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "startCursor"
        -]New value: +[
        +  "url"
        +]
    • Changedfetch_json23 fields changed
      • changedInput schema / properties / autoDetectMode / description
        Previous value: -"Optional flag to automatically switch to browser mode if standard fetch fails (default: true). Set to false to strictly use the specified mode without automatic switching."New value: +"Retry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed."
      • changedInput schema / properties / chunkId / description
        Previous value: -"Optional chunk ID for retrieving a specific chunk of content from a previous request. The system adds prompts in the format === SYSTEM NOTE === ... =================== which AI models should ignore when processing the content."New value: +"Legacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor."
      • changedInput schema / properties / closeBrowser / description
        Previous value: -"Optional flag to close the browser after fetching (default: false)"New value: +"Close the browser after this call. Default: false."
      • changedInput schema / properties / contentSizeLimit / description
        Previous value: -"Optional maximum content size in bytes before splitting into chunks (default: 50KB). Set between 20KB-50KB for optimal results. For large content, prefer smaller values (20KB-30KB) to avoid truncation."New value: +"Legacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars."
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Continuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.",
        +  "type": "string"
        +}
      • changedInput schema / properties / debug / description
        Previous value: -"Optional flag to enable detailed debug logging (default: false)"New value: +"Write debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics."
      • changedInput schema / properties / enableContentSplitting / description
        Previous value: -"Optional flag to enable content splitting for large responses (default: true)"New value: +"When false, oversized content is truncated with no continuation cursor. Default: true."
      • changedInput schema / properties / headers / description
        Previous value: -"Optional headers to include in the request"New value: +"Optional request headers as a string-to-string map."
      • addedInput schema / properties / maxBytes
        Added value: +{
        +  "description": "Maximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.",
        +  "type": "number"
        +}
      • addedInput schema / properties / maxChars
        Added value: +{
        +  "description": "Maximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.",
        +  "type": "number"
        +}
      • changedInput schema / properties / maxRedirects / description
        Previous value: -"Optional maximum number of redirects to follow (default: 10)"New value: +"Maximum redirects to follow. Default: 10. Each redirect is checked for SSRF."
      • changedInput schema / properties / noDelay / description
        Previous value: -"Optional flag to disable random delay between requests (default: false)"New value: +"Skip the random delay between redirects. Default: false."
      • changedInput schema / properties / proxy / description
        Previous value: -"Optional proxy server to use (format: http://host:port or https://host:port)"New value: +"Optional proxy URL (http://host:port or https://host:port)."
      • changedInput schema / properties / saveCookies / description
        Previous value: -"Optional flag to save cookies for future requests to the same domain (default: true)"New value: +"Keep cookies for the same site across browser-mode calls. Default: true."
      • changedInput schema / properties / scrollToBottom / description
        Previous value: -"Optional flag to scroll to bottom of page in browser mode (default: false)"New value: +"Scroll to the bottom before reading the page in browser mode. Default: false."
      • changedInput schema / properties / startCursor / description
        Previous value: -"Starting cursor position in bytes. Set to 0 for initial requests, and use the value from previous responses for subsequent requests to resume content retrieval."New value: +"Legacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation."
      • changedInput schema / properties / timeout / description
        Previous value: -"Optional timeout in milliseconds (default: 30000)"New value: +"Request timeout in milliseconds. Default: 30000."
      • changedInput schema / properties / url / description
        Previous value: -"URL of the website to fetch"New value: +"Absolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response."
      • changedInput schema / properties / useBrowser / description
        Previous value: -"Optional flag to use headless browser for fetching (default: false)"New value: +"Use the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches."
      • changedInput schema / properties / useSystemProxy / description
        Previous value: -"Optional flag to use system proxy environment variables (default: true)"New value: +"Use HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true."
      • changedInput schema / properties / waitForSelector / description
        Previous value: -"Optional CSS selector to wait for when using browser mode"New value: +"CSS selector to wait for in browser mode."
      • changedInput schema / properties / waitForTimeout / description
        Previous value: -"Optional timeout to wait after page load in browser mode (default: 5000)"New value: +"Extra wait after load in browser mode, in milliseconds. Default: 5000."
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "startCursor"
        -]New value: +[
        +  "url"
        +]
    • Changedfetch_markdown26 fields changed
      • changedInput schema / properties / autoDetectMode / description
        Previous value: -"Optional flag to automatically switch to browser mode if standard fetch fails (default: true). Set to false to strictly use the specified mode without automatic switching."New value: +"Retry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed."
      • changedInput schema / properties / chunkId / description
        Previous value: -"Optional chunk ID for retrieving a specific chunk of content from a previous request. The system adds prompts in the format === SYSTEM NOTE === ... =================== which AI models should ignore when processing the content."New value: +"Legacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor."
      • changedInput schema / properties / closeBrowser / description
        Previous value: -"Optional flag to close the browser after fetching (default: false)"New value: +"Close the browser after this call. Default: false."
      • changedInput schema / properties / contentSizeLimit / description
        Previous value: -"Optional maximum content size in bytes before splitting into chunks (default: 50KB). Set between 20KB-50KB for optimal results. For large content, prefer smaller values (20KB-30KB) to avoid truncation."New value: +"Legacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars."
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Continuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.",
        +  "type": "string"
        +}
      • changedInput schema / properties / debug / description
        Previous value: -"Optional flag to enable detailed debug logging (default: false)"New value: +"Write debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics."
      • changedInput schema / properties / enableContentSplitting / description
        Previous value: -"Optional flag to enable content splitting for large responses (default: true)"New value: +"When false, oversized content is truncated with no continuation cursor. Default: true."
      • changedInput schema / properties / extractContent / description
        Previous value: -"Optional flag to enable intelligent content extraction using Readability algorithm (default: false). Extracts main article content from web pages."New value: +"Extract the main article with Readability before converting. Default: true for markdown and plaintext, false for html, json, and txt."
      • changedInput schema / properties / fallbackToOriginal / description
        Previous value: -"Optional flag to fall back to the original content when extraction fails (default: true). Only works when extractContent is true."New value: +"If Readability finds no article, convert the original document. Default: true."
      • changedInput schema / properties / headers / description
        Previous value: -"Optional headers to include in the request"New value: +"Optional request headers as a string-to-string map."
      • changedInput schema / properties / includeMetadata / description
        Previous value: -"Optional flag to include metadata (title, author, etc.) in the extracted content (default: false). Only works when extractContent is true."New value: +"Include title, byline, and site name when extractContent is true. Default: true."
      • addedInput schema / properties / maxBytes
        Added value: +{
        +  "description": "Maximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.",
        +  "type": "number"
        +}
      • addedInput schema / properties / maxChars
        Added value: +{
        +  "description": "Maximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.",
        +  "type": "number"
        +}
      • changedInput schema / properties / maxRedirects / description
        Previous value: -"Optional maximum number of redirects to follow (default: 10)"New value: +"Maximum redirects to follow. Default: 10. Each redirect is checked for SSRF."
      • changedInput schema / properties / noDelay / description
        Previous value: -"Optional flag to disable random delay between requests (default: false)"New value: +"Skip the random delay between redirects. Default: false."
      • changedInput schema / properties / proxy / description
        Previous value: -"Optional proxy server to use (format: http://host:port or https://host:port)"New value: +"Optional proxy URL (http://host:port or https://host:port)."
      • changedInput schema / properties / saveCookies / description
        Previous value: -"Optional flag to save cookies for future requests to the same domain (default: true)"New value: +"Keep cookies for the same site across browser-mode calls. Default: true."
      • changedInput schema / properties / scrollToBottom / description
        Previous value: -"Optional flag to scroll to bottom of page in browser mode (default: false)"New value: +"Scroll to the bottom before reading the page in browser mode. Default: false."
      • changedInput schema / properties / startCursor / description
        Previous value: -"Starting cursor position in bytes. Set to 0 for initial requests, and use the value from previous responses for subsequent requests to resume content retrieval."New value: +"Legacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation."
      • changedInput schema / properties / timeout / description
        Previous value: -"Optional timeout in milliseconds (default: 30000)"New value: +"Request timeout in milliseconds. Default: 30000."
      • changedInput schema / properties / url / description
        Previous value: -"URL of the website to fetch"New value: +"Absolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response."
      • changedInput schema / properties / useBrowser / description
        Previous value: -"Optional flag to use headless browser for fetching (default: false)"New value: +"Use the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches."
      • changedInput schema / properties / useSystemProxy / description
        Previous value: -"Optional flag to use system proxy environment variables (default: true)"New value: +"Use HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true."
      • changedInput schema / properties / waitForSelector / description
        Previous value: -"Optional CSS selector to wait for when using browser mode"New value: +"CSS selector to wait for in browser mode."
      • changedInput schema / properties / waitForTimeout / description
        Previous value: -"Optional timeout to wait after page load in browser mode (default: 5000)"New value: +"Extra wait after load in browser mode, in milliseconds. Default: 5000."
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "startCursor"
        -]New value: +[
        +  "url"
        +]
    • Changedfetch_plaintext26 fields changed
      • changedInput schema / properties / autoDetectMode / description
        Previous value: -"Optional flag to automatically switch to browser mode if standard fetch fails (default: true). Set to false to strictly use the specified mode without automatic switching."New value: +"Retry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed."
      • changedInput schema / properties / chunkId / description
        Previous value: -"Optional chunk ID for retrieving a specific chunk of content from a previous request. The system adds prompts in the format === SYSTEM NOTE === ... =================== which AI models should ignore when processing the content."New value: +"Legacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor."
      • changedInput schema / properties / closeBrowser / description
        Previous value: -"Optional flag to close the browser after fetching (default: false)"New value: +"Close the browser after this call. Default: false."
      • changedInput schema / properties / contentSizeLimit / description
        Previous value: -"Optional maximum content size in bytes before splitting into chunks (default: 50KB). Set between 20KB-50KB for optimal results. For large content, prefer smaller values (20KB-30KB) to avoid truncation."New value: +"Legacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars."
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Continuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.",
        +  "type": "string"
        +}
      • changedInput schema / properties / debug / description
        Previous value: -"Optional flag to enable detailed debug logging (default: false)"New value: +"Write debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics."
      • changedInput schema / properties / enableContentSplitting / description
        Previous value: -"Optional flag to enable content splitting for large responses (default: true)"New value: +"When false, oversized content is truncated with no continuation cursor. Default: true."
      • changedInput schema / properties / extractContent / description
        Previous value: -"Optional flag to enable intelligent content extraction using Readability algorithm (default: false). Extracts main article content from web pages."New value: +"Extract the main article with Readability before converting. Default: true for markdown and plaintext, false for html, json, and txt."
      • changedInput schema / properties / fallbackToOriginal / description
        Previous value: -"Optional flag to fall back to the original content when extraction fails (default: true). Only works when extractContent is true."New value: +"If Readability finds no article, convert the original document. Default: true."
      • changedInput schema / properties / headers / description
        Previous value: -"Optional headers to include in the request"New value: +"Optional request headers as a string-to-string map."
      • changedInput schema / properties / includeMetadata / description
        Previous value: -"Optional flag to include metadata (title, author, etc.) in the extracted content (default: false). Only works when extractContent is true."New value: +"Include title, byline, and site name when extractContent is true. Default: true."
      • addedInput schema / properties / maxBytes
        Added value: +{
        +  "description": "Maximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.",
        +  "type": "number"
        +}
      • addedInput schema / properties / maxChars
        Added value: +{
        +  "description": "Maximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.",
        +  "type": "number"
        +}
      • changedInput schema / properties / maxRedirects / description
        Previous value: -"Optional maximum number of redirects to follow (default: 10)"New value: +"Maximum redirects to follow. Default: 10. Each redirect is checked for SSRF."
      • changedInput schema / properties / noDelay / description
        Previous value: -"Optional flag to disable random delay between requests (default: false)"New value: +"Skip the random delay between redirects. Default: false."
      • changedInput schema / properties / proxy / description
        Previous value: -"Optional proxy server to use (format: http://host:port or https://host:port)"New value: +"Optional proxy URL (http://host:port or https://host:port)."
      • changedInput schema / properties / saveCookies / description
        Previous value: -"Optional flag to save cookies for future requests to the same domain (default: true)"New value: +"Keep cookies for the same site across browser-mode calls. Default: true."
      • changedInput schema / properties / scrollToBottom / description
        Previous value: -"Optional flag to scroll to bottom of page in browser mode (default: false)"New value: +"Scroll to the bottom before reading the page in browser mode. Default: false."
      • changedInput schema / properties / startCursor / description
        Previous value: -"Starting cursor position in bytes. Set to 0 for initial requests, and use the value from previous responses for subsequent requests to resume content retrieval."New value: +"Legacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation."
      • changedInput schema / properties / timeout / description
        Previous value: -"Optional timeout in milliseconds (default: 30000)"New value: +"Request timeout in milliseconds. Default: 30000."
      • changedInput schema / properties / url / description
        Previous value: -"URL of the website to fetch"New value: +"Absolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response."
      • changedInput schema / properties / useBrowser / description
        Previous value: -"Optional flag to use headless browser for fetching (default: false)"New value: +"Use the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches."
      • changedInput schema / properties / useSystemProxy / description
        Previous value: -"Optional flag to use system proxy environment variables (default: true)"New value: +"Use HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true."
      • changedInput schema / properties / waitForSelector / description
        Previous value: -"Optional CSS selector to wait for when using browser mode"New value: +"CSS selector to wait for in browser mode."
      • changedInput schema / properties / waitForTimeout / description
        Previous value: -"Optional timeout to wait after page load in browser mode (default: 5000)"New value: +"Extra wait after load in browser mode, in milliseconds. Default: 5000."
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "startCursor"
        -]New value: +[
        +  "url"
        +]
    • Changedfetch_txt26 fields changed
      • changedInput schema / properties / autoDetectMode / description
        Previous value: -"Optional flag to automatically switch to browser mode if standard fetch fails (default: true). Set to false to strictly use the specified mode without automatic switching."New value: +"Retry with the browser after an HTTP 403 or challenge page. Default: false. Set true only when the HTTP fetch is blocked and puppeteer is installed."
      • changedInput schema / properties / chunkId / description
        Previous value: -"Optional chunk ID for retrieving a specific chunk of content from a previous request. The system adds prompts in the format === SYSTEM NOTE === ... =================== which AI models should ignore when processing the content."New value: +"Legacy or document id. Prefer cursor. With a 1.x byte chunk, also pass startCursor."
      • changedInput schema / properties / closeBrowser / description
        Previous value: -"Optional flag to close the browser after fetching (default: false)"New value: +"Close the browser after this call. Default: false."
      • changedInput schema / properties / contentSizeLimit / description
        Previous value: -"Optional maximum content size in bytes before splitting into chunks (default: 50KB). Set between 20KB-50KB for optimal results. For large content, prefer smaller values (20KB-30KB) to avoid truncation."New value: +"Legacy byte chunk size. When set without maxChars/maxBytes, the 1.x byte splitter is used. Prefer maxChars."
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Continuation token from a previous truncated response (nextCursor). Omit on the first call. When set, the server returns the next slice and does not refetch the URL.",
        +  "type": "string"
        +}
      • changedInput schema / properties / debug / description
        Previous value: -"Optional flag to enable detailed debug logging (default: false)"New value: +"Write debug logs to stderr. Default: false. Do not enable unless the user asked for diagnostics."
      • changedInput schema / properties / enableContentSplitting / description
        Previous value: -"Optional flag to enable content splitting for large responses (default: true)"New value: +"When false, oversized content is truncated with no continuation cursor. Default: true."
      • removedInput schema / properties / extractContent
        Removed value: -{
        -  "description": "Optional flag to enable intelligent content extraction using Readability algorithm (default: false). Extracts main article content from web pages.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / fallbackToOriginal
        Removed value: -{
        -  "description": "Optional flag to fall back to the original content when extraction fails (default: true). Only works when extractContent is true.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / headers / description
        Previous value: -"Optional headers to include in the request"New value: +"Optional request headers as a string-to-string map."
      • removedInput schema / properties / includeMetadata
        Removed value: -{
        -  "description": "Optional flag to include metadata (title, author, etc.) in the extracted content (default: false). Only works when extractContent is true.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / maxBytes
        Added value: +{
        +  "description": "Maximum UTF-8 bytes to return in this response. Default: 1048576. Used together with maxChars; the smaller budget wins.",
        +  "type": "number"
        +}
      • addedInput schema / properties / maxChars
        Added value: +{
        +  "description": "Maximum characters to return in this response. Default: 100000. The cut prefers a newline or space. Omit this on a normal fetch.",
        +  "type": "number"
        +}
      • changedInput schema / properties / maxRedirects / description
        Previous value: -"Optional maximum number of redirects to follow (default: 10)"New value: +"Maximum redirects to follow. Default: 10. Each redirect is checked for SSRF."
      • changedInput schema / properties / noDelay / description
        Previous value: -"Optional flag to disable random delay between requests (default: false)"New value: +"Skip the random delay between redirects. Default: false."
      • changedInput schema / properties / proxy / description
        Previous value: -"Optional proxy server to use (format: http://host:port or https://host:port)"New value: +"Optional proxy URL (http://host:port or https://host:port)."
      • changedInput schema / properties / saveCookies / description
        Previous value: -"Optional flag to save cookies for future requests to the same domain (default: true)"New value: +"Keep cookies for the same site across browser-mode calls. Default: true."
      • changedInput schema / properties / scrollToBottom / description
        Previous value: -"Optional flag to scroll to bottom of page in browser mode (default: false)"New value: +"Scroll to the bottom before reading the page in browser mode. Default: false."
      • changedInput schema / properties / startCursor / description
        Previous value: -"Starting cursor position in bytes. Set to 0 for initial requests, and use the value from previous responses for subsequent requests to resume content retrieval."New value: +"Legacy byte offset used only with chunkId from a 1.x split. Not required. Do not send this for a normal fetch or for a cursor continuation."
      • changedInput schema / properties / timeout / description
        Previous value: -"Optional timeout in milliseconds (default: 30000)"New value: +"Request timeout in milliseconds. Default: 30000."
      • changedInput schema / properties / url / description
        Previous value: -"URL of the website to fetch"New value: +"Absolute http(s) URL to fetch. Required on the first call. Optional when cursor or chunkId continues a truncated response."
      • changedInput schema / properties / useBrowser / description
        Previous value: -"Optional flag to use headless browser for fetching (default: false)"New value: +"Use the optional headless browser. Default: false. Requires puppeteer to be installed. Leave false for normal HTTP fetches."
      • changedInput schema / properties / useSystemProxy / description
        Previous value: -"Optional flag to use system proxy environment variables (default: true)"New value: +"Use HTTP_PROXY / HTTPS_PROXY / NO_PROXY when no proxy argument is set. Default: true."
      • changedInput schema / properties / waitForSelector / description
        Previous value: -"Optional CSS selector to wait for when using browser mode"New value: +"CSS selector to wait for in browser mode."
      • changedInput schema / properties / waitForTimeout / description
        Previous value: -"Optional timeout to wait after page load in browser mode (default: 5000)"New value: +"Extra wait after load in browser mode, in milliseconds. Default: 5000."
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "startCursor"
        -]New value: +[
        +  "url"
        +]
  2. 5 tool updatesv1.3.2
    • First observedfetch_html
    • First observedfetch_json
    • First observedfetch_markdown
    • First observedfetch_plaintext
    • First observedfetch_txt

TDQS

A3.6/5.0

Scored across 6 tools

Disambiguation2/5

The five alias tools are explicitly deprecated duplicates of fetch with a preset format, so an agent can easily pick fetch_html instead of fetch with format=html. The descriptions do warn against this, but the tool set still presents six overlapping entry points for essentially one operation.

Naming Consistency4/5

All names use a consistent snake_case fetch_* pattern, with the base tool simply named fetch. The convention is predictable, though the aliases create redundant variants rather than distinct operations.

Tool Count2/5

Six tools are listed, but five are deprecated aliases that add no new capability. The effective surface is one tool, making the count misleading and cluttered rather than well-scoped.

Completeness4/5

The core fetch tool covers multiple formats, truncation cursors, timeouts, size limits, and optional browser rendering, which is solid coverage for an HTTP fetching server. The aliases do not fill real gaps, but the primary tool is fairly complete.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that fetches web pages and extracts clean, AI-friendly Markdown content using Mozilla Readability. It provides secure web access for LLMs with built-in SSRF protection and automated content cleaning for improved context retrieval and summarization.
    1
    515 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A locally-hosted MCP server that provides AI assistants with advanced web crawling capabilities, including structured data extraction, deep site crawling, and page screenshots. It enables users to convert single or multiple URLs into clean Markdown content for processing by LLMs without requiring external API keys for basic features.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that gives AI tools a reliable way to fetch content from the web, handling anti-bot protection and JavaScript-rendered pages.
    1,986 npm
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that provides browser-grade web access for AI agents, using Chrome's actual network stack to bypass anti-bot protections and return clean markdown.
    9
    -

Appeared in Searches