# io.github.YawLabs/fetch-mcp (npm · @yawlabs/fetch-mcp)

HTTP fetch MCP server: SSRF protection, HTML-to-markdown, reader mode, metadata extraction

- Trust score: 66/100 (medium)
- Change this week: +54
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-07

## Components

- npm · `@yawlabs/fetch-mcp`: 66/100 (this document), [markdown](https://verifymcp.io/servers/yawlabs-fetch-mcp/yawlabs-fetch-mcp.md), [page](https://verifymcp.io/servers/yawlabs-fetch-mcp/yawlabs-fetch-mcp)

## Channel facts

- Registry: `npm`
- Package: `@yawlabs/fetch-mcp`
- Version: `0.3.6`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-07.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 106 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 19/100
  - Repository check failed: no source repository is declared.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 16 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 61/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3703 tokens (~246/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 40/100
  - Stability observed for 12 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 93/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 80% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add yawlabs-fetch-mcp -- npx -y @yawlabs/fetch-mcp
```

### Codex

```bash
codex mcp add yawlabs-fetch-mcp -- npx -y @yawlabs/fetch-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "yawlabs-fetch-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@yawlabs/fetch-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add yawlabs-fetch-mcp --command npx --arg -y --arg @yawlabs/fetch-mcp
```

### Hermes

```yaml
mcp_servers:
  yawlabs-fetch-mcp:
    command: "npx"
    args: ["-y", "@yawlabs/fetch-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "yawlabs-fetch-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@yawlabs/fetch-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-07 (score 66, +4)

- [security improvement] Known CVEs: partial → pass
- [functional regression] Security disclosure: fail → unverified
- [functional] Dependency health: partial → 0.87

### 2026-08-06 (score 62, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-05 (score 61, +1)

- [security improvement] CVE-2026-69207 no longer affects this package
- [security improvement] Known CVEs: fail → partial

### 2026-08-04 (score 60, 0)

- [security regression] CVE-2026-69207 affects this package: medium
- [security regression] Known CVEs: partial → fail

### 2026-08-02 (score 60, +48)

- [security regression] Provenance: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional regression] Security disclosure: unverified → fail
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Stability: unverified → 0.23
- [functional improvement] MCP protocol: unverified → pass
- [functional] Licence: MIT

### 2026-07-31 (score 12, −23)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-27 (score 35)

First indexed and scored.

## MCP tools (15)

### `http_get` (~327 tokens)

Perform an HTTP GET. Returns status, headers, and body. Automatically parses JSON when the server responds with application/json. Follows redirects (each hop re-validated against SSRF rules). Refuses URLs that resolve to private/loopback/link-local addresses unless allow_private_hosts is set.

Input parameters:

- `allow_private_hosts` (boolean): Allow requests to loopback / private / link-local addresses. SSRF protection is on by default — only flip this when intentionally talking to localhost.
- `basic_auth` (object): HTTP Basic auth credentials
- `bearer_token` (string): Bearer token sent as Authorization: Bearer <token>
- `decode_text` (boolean): Force text decoding (true) or binary base64 (false). Defaults to auto — text for text/*, json, xml, etc; binary otherwise.
- `headers` (object): Extra request headers as a key/value object
- `max_bytes` (integer): Max response body size in bytes before the body is truncated (default 5MiB, ceiling 100MiB)
- `max_redirects` (integer): Max redirect hops to follow (default 5)
- `retries` (integer): Retries on 408/425/429/500/502/503/504 with exponential backoff (default 0)
- `timeout_ms` (integer): Request timeout in ms (default 10000, max 120000)
- `url` (string, required): Target URL (http:// or https://)
- `user_agent` (string): User-Agent override (default identifies as @yawlabs/fetch-mcp)

### `http_post` (~379 tokens)

Perform an HTTP POST. Body can be given as a raw string (body) or as a JSON value (body_json — auto-sets content-type to application/json). NOT idempotent: calling twice submits twice.

Input parameters:

- `allow_private_hosts` (boolean): Allow requests to loopback / private / link-local addresses. SSRF protection is on by default — only flip this when intentionally talking to localhost.
- `basic_auth` (object): HTTP Basic auth credentials
- `bearer_token` (string): Bearer token sent as Authorization: Bearer <token>
- `body` (string): Raw request body as a string
- `body_json`: Request body as a JSON value — sets content-type to application/json if none given
- `content_type` (string): Content-Type header to send with the body (e.g. application/json, text/plain, application/x-www-form-urlencoded)
- `decode_text` (boolean): Force text decoding (true) or binary base64 (false). Defaults to auto — text for text/*, json, xml, etc; binary otherwise.
- `headers` (object): Extra request headers as a key/value object
- `max_bytes` (integer): Max response body size in bytes before the body is truncated (default 5MiB, ceiling 100MiB)
- `max_redirects` (integer): Max redirect hops to follow (default 5)
- `retries` (integer): Retries on 408/425/429/500/502/503/504 with exponential backoff (default 0)
- `timeout_ms` (integer): Request timeout in ms (default 10000, max 120000)
- `url` (string, required): Target URL (http:// or https://)
- `user_agent` (string): User-Agent override (default identifies as @yawlabs/fetch-mcp)

### `http_put` (~363 tokens)

Perform an HTTP PUT. Use for full-resource replacement. Idempotent: the same PUT applied twice leaves the resource in the same state.

Input parameters:

- `allow_private_hosts` (boolean): Allow requests to loopback / private / link-local addresses. SSRF protection is on by default — only flip this when intentionally talking to localhost.
- `basic_auth` (object): HTTP Basic auth credentials
- `bearer_token` (string): Bearer token sent as Authorization: Bearer <token>
- `body` (string): Raw request body as a string
- `body_json`: Request body as a JSON value — sets content-type to application/json if none given
- `content_type` (string): Content-Type header to send with the body (e.g. application/json, text/plain, application/x-www-form-urlencoded)
- `decode_text` (boolean): Force text decoding (true) or binary base64 (false). Defaults to auto — text for text/*, json, xml, etc; binary otherwise.
- `headers` (object): Extra request headers as a key/value object
- `max_bytes` (integer): Max response body size in bytes before the body is truncated (default 5MiB, ceiling 100MiB)
- `max_redirects` (integer): Max redirect hops to follow (default 5)
- `retries` (integer): Retries on 408/425/429/500/502/503/504 with exponential backoff (default 0)
- `timeout_ms` (integer): Request timeout in ms (default 10000, max 120000)
- `url` (string, required): Target URL (http:// or https://)
- `user_agent` (string): User-Agent override (default identifies as @yawlabs/fetch-mcp)

### `http_patch` (~361 tokens)

Perform an HTTP PATCH. Use for partial updates. Spec-wise NOT guaranteed idempotent — depends on the server's patch semantics.

Input parameters:

- `allow_private_hosts` (boolean): Allow requests to loopback / private / link-local addresses. SSRF protection is on by default — only flip this when intentionally talking to localhost.
- `basic_auth` (object): HTTP Basic auth credentials
- `bearer_token` (string): Bearer token sent as Authorization: Bearer <token>
- `body` (string): Raw request body as a string
- `body_json`: Request body as a JSON value — sets content-type to application/json if none given
- `content_type` (string): Content-Type header to send with the body (e.g. application/json, text/plain, application/x-www-form-urlencoded)
- `decode_text` (boolean): Force text decoding (true) or binary base64 (false). Defaults to auto — text for text/*, json, xml, etc; binary otherwise.
- `headers` (object): Extra request headers as a key/value object
- `max_bytes` (integer): Max response body size in bytes before the body is truncated (default 5MiB, ceiling 100MiB)
- `max_redirects` (integer): Max redirect hops to follow (default 5)
- `retries` (integer): Retries on 408/425/429/500/502/503/504 with exponential backoff (default 0)
- `timeout_ms` (integer): Request timeout in ms (default 10000, max 120000)
- `url` (string, required): Target URL (http:// or https://)
- `user_agent` (string): User-Agent override (default identifies as @yawlabs/fetch-mcp)

### `http_delete` (~363 tokens)

Perform an HTTP DELETE. Idempotent (per spec): a repeated DELETE on an already-deleted resource typically returns 404/410.

Input parameters:

- `allow_private_hosts` (boolean): Allow requests to loopback / private / link-local addresses. SSRF protection is on by default — only flip this when intentionally talking to localhost.
- `basic_auth` (object): HTTP Basic auth credentials
- `bearer_token` (string): Bearer token sent as Authorization: Bearer <token>
- `body` (string): Raw request body as a string
- `body_json`: Request body as a JSON value — sets content-type to application/json if none given
- `content_type` (string): Content-Type header to send with the body (e.g. application/json, text/plain, application/x-www-form-urlencoded)
- `decode_text` (boolean): Force text decoding (true) or binary base64 (false). Defaults to auto — text for text/*, json, xml, etc; binary otherwise.
- `headers` (object): Extra request headers as a key/value object
- `max_bytes` (integer): Max response body size in bytes before the body is truncated (default 5MiB, ceiling 100MiB)
- `max_redirects` (integer): Max redirect hops to follow (default 5)
- `retries` (integer): Retries on 408/425/429/500/502/503/504 with exponential backoff (default 0)
- `timeout_ms` (integer): Request timeout in ms (default 10000, max 120000)
- `url` (string, required): Target URL (http:// or https://)
- `user_agent` (string): User-Agent override (default identifies as @yawlabs/fetch-mcp)

### `http_head` (~302 tokens)

Perform an HTTP HEAD. Returns status + headers with no body. Useful for checking a resource exists, getting its size (Content-Length), or polling for changes cheaply.

Input parameters:

- `allow_private_hosts` (boolean): Allow requests to loopback / private / link-local addresses. SSRF protection is on by default — only flip this when intentionally talking to localhost.
- `basic_auth` (object): HTTP Basic auth credentials
- `bearer_token` (string): Bearer token sent as Authorization: Bearer <token>
- `decode_text` (boolean): Force text decoding (true) or binary base64 (false). Defaults to auto — text for text/*, json, xml, etc; binary otherwise.
- `headers` (object): Extra request headers as a key/value object
- `max_bytes` (integer): Max response body size in bytes before the body is truncated (default 5MiB, ceiling 100MiB)
- `max_redirects` (integer): Max redirect hops to follow (default 5)
- `retries` (integer): Retries on 408/425/429/500/502/503/504 with exponential backoff (default 0)
- `timeout_ms` (integer): Request timeout in ms (default 10000, max 120000)
- `url` (string, required): Target URL (http:// or https://)
- `user_agent` (string): User-Agent override (default identifies as @yawlabs/fetch-mcp)

### `http_options` (~293 tokens)

Perform an HTTP OPTIONS. Returns the server's supported methods and CORS policy for a resource. Helpful for API discovery.

Input parameters:

- `allow_private_hosts` (boolean): Allow requests to loopback / private / link-local addresses. SSRF protection is on by default — only flip this when intentionally talking to localhost.
- `basic_auth` (object): HTTP Basic auth credentials
- `bearer_token` (string): Bearer token sent as Authorization: Bearer <token>
- `decode_text` (boolean): Force text decoding (true) or binary base64 (false). Defaults to auto — text for text/*, json, xml, etc; binary otherwise.
- `headers` (object): Extra request headers as a key/value object
- `max_bytes` (integer): Max response body size in bytes before the body is truncated (default 5MiB, ceiling 100MiB)
- `max_redirects` (integer): Max redirect hops to follow (default 5)
- `retries` (integer): Retries on 408/425/429/500/502/503/504 with exponential backoff (default 0)
- `timeout_ms` (integer): Request timeout in ms (default 10000, max 120000)
- `url` (string, required): Target URL (http:// or https://)
- `user_agent` (string): User-Agent override (default identifies as @yawlabs/fetch-mcp)

### `fetch_html_to_markdown` (~189 tokens)

GET a URL, decode the HTML, and convert to clean markdown (headings, lists, links, code fences). Scripts, styles, iframes, nav, footer, and aside elements are stripped. Intended for feeding web pages into an LLM cheaply -- markdown is usually 3-8x smaller than raw HTML. Follows redirects, respects size/timeout limits, and blocks private-host requests by default.

Input parameters:

- `allow_private_hosts` (boolean): Allow loopback / private / link-local addresses (default false)
- `max_bytes` (integer): Max response size in bytes (default 5MiB)
- `max_redirects` (integer): Max redirect hops (default 5)
- `timeout_ms` (integer): Request timeout in ms (default 10000)
- `url` (string, required): URL to fetch
- `user_agent` (string): User-Agent override

### `fetch_html_to_text` (~149 tokens)

GET a URL, decode the HTML, and return plain text with block-level structure preserved as newlines. Scripts, styles, and comments stripped; HTML entities decoded. Lighter than markdown when you only need the reading content.

Input parameters:

- `allow_private_hosts` (boolean): Allow loopback / private / link-local addresses (default false)
- `max_bytes` (integer): Max response size in bytes (default 5MiB)
- `max_redirects` (integer): Max redirect hops (default 5)
- `timeout_ms` (integer): Request timeout in ms (default 10000)
- `url` (string, required): URL to fetch
- `user_agent` (string): User-Agent override

### `fetch_robots` (~138 tokens)

Fetch and parse the robots.txt for a given origin, then tell the caller whether a target URL is crawlable by a given user-agent. Follows the Google-style longest-match rule with Allow-wins-on-tie. Returns the raw robots.txt, parsed groups, sitemap references, and the allow/deny verdict with the matching rule.

Input parameters:

- `allow_private_hosts` (boolean)
- `max_redirects` (integer)
- `timeout_ms` (integer)
- `url` (string, required): Target URL to check. We derive origin + path automatically.
- `user_agent` (string): User-agent string to match against groups (default '*')

### `fetch_sitemap` (~222 tokens)

Fetch a sitemap.xml (or sitemap-index) and return the contained URLs with their lastmod / changefreq / priority. Follows sitemap-index chaining up to max_depth levels. Gzipped .xml.gz payloads are auto-decompressed. Partial failures (one child sitemap 500s while others work) are returned under 'warnings' without aborting the whole request. SSRF-protected by default.

Input parameters:

- `allow_private_hosts` (boolean)
- `max_bytes` (integer): Max bytes to read per sitemap response (default 20MiB)
- `max_depth` (integer): How many sitemap-index levels to follow (default 1). 0 keeps the top-level index flat and only returns its childSitemaps list.
- `max_redirects` (integer)
- `max_urls` (integer): Cap on total URLs returned (default 5000)
- `timeout_ms` (integer)
- `url` (string, required): Sitemap URL (sitemap.xml, sitemap.xml.gz, or a sitemap index)
- `user_agent` (string)

### `fetch_meta` (~161 tokens)

GET a URL and extract its head metadata: title, description, canonical, language, robots directive, Open Graph / Twitter Card / article: properties, icon links, RSS/Atom feed links, and any JSON-LD (schema.org) blocks. Keys that appear more than once (e.g. multiple og:image tags) are additionally returned via ogAll/twitterAll/articleAll arrays. Ideal for previewing a page before fully reading it.

Input parameters:

- `allow_private_hosts` (boolean)
- `max_bytes` (integer): Default 2MiB — metadata lives in <head>
- `max_redirects` (integer)
- `timeout_ms` (integer)
- `url` (string, required): URL to extract metadata from
- `user_agent` (string)

### `fetch_links` (~173 tokens)

Extract every outbound link from an HTML page, resolved to absolute URLs. Each entry includes href, anchor text, optional rel/title, and an internal/external classification (bare-domain and www. treated as the same host). Anchors (#), javascript:, mailto:, tel:, data:, and file: URIs are skipped. Respects <base href>.

Input parameters:

- `allow_private_hosts` (boolean)
- `dedupe` (boolean): Drop duplicate hrefs (default true)
- `filter` (string): Filter by type (default 'all')
- `limit` (integer): Cap on returned links (default 1000)
- `max_bytes` (integer)
- `max_redirects` (integer)
- `timeout_ms` (integer)
- `url` (string, required)
- `user_agent` (string)

### `fetch_feed` (~147 tokens)

Fetch and parse an RSS 2.0 or Atom 1.0 feed. Returns feed-level metadata (title, description, link, updated) plus a list of entries (title, link, id, published, updated, author, summary, content, contentType, categories). Auto-detects RSS vs Atom.

Input parameters:

- `allow_private_hosts` (boolean)
- `limit` (integer): Max entries to return (default 50)
- `max_bytes` (integer): Max bytes to read (default 10MiB)
- `max_redirects` (integer)
- `timeout_ms` (integer)
- `url` (string, required)
- `user_agent` (string)

### `fetch_reader` (~136 tokens)

GET a URL, locate the main article body (prefers <article>, <main>, itemprop=articleBody, or known CMS class names; falls back to <body>), strip navigation/footer/aside chrome, and convert to clean markdown. Returns { title, byline, markdown, wordCount }. Optimized for feeding long-form articles into an LLM without header/footer/sidebar noise.

Input parameters:

- `allow_private_hosts` (boolean)
- `max_bytes` (integer)
- `max_redirects` (integer)
- `timeout_ms` (integer)
- `url` (string, required)
- `user_agent` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/yawlabs-fetch-mcp/yawlabs-fetch-mcp#diagnostics

## Score history

- 2026-08-07: 66
- 2026-08-06: 62
- 2026-08-05: 61
- 2026-08-04: 60
- 2026-08-03: 60
- 2026-08-02: 60
- 2026-08-01: 12
- 2026-07-31: 12
- 2026-07-30: 35
- 2026-07-28: 35
- 2026-07-27: 35

## Links

- npm package: https://www.npmjs.com/package/@yawlabs/fetch-mcp
- Socket report: https://socket.dev/npm/package/@yawlabs/fetch-mcp
- Changelog RSS feed: https://verifymcp.io/servers/yawlabs-fetch-mcp/yawlabs-fetch-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/yawlabs-fetch-mcp/yawlabs-fetch-mcp.json
- HTML version of this page: https://verifymcp.io/servers/yawlabs-fetch-mcp/yawlabs-fetch-mcp
