# SteadyFetch

> Reliable web fetching for AI agents with retry, circuit breaker, caching, and anti-bot bypass

- name: io.github.carsonroell-debug/steadyfetch
- version: 0.1.1
- connection class: unknown (unknown)
- trust: 36/100 flags: no-repository
- quality: 77/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.carsonroell-debug%2Fsteadyfetch
- tools: https://api.protogrid.dev/v1/servers/io.github.carsonroell-debug%2Fsteadyfetch/tools

**Not classified yet.** The remote endpoints have not been probed successfully, or the listing has nothing to connect to.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "steadyfetch": {
      "type": "http",
      "url": "https://steadyfetch-production.up.railway.app/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 0
- freshness: 45
- provenance: 35
- drivers: -unreachable(6 failures) -stale-203d -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 77/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 71 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: cache_stats (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); clear_cache (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); fetch_url (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 637 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: 67 (weight 15)

- fail `deps.known_vulns`: 2 advisories to act on (malicious, or rated high or critical with a fix available): GHSA-2g87-pp6c-29x5 in aiohttp@3.14.3 (indirect, fixed in 3.14.4), GHSA-5wr8-gcqf-gqf3 in aiohttp@3.14.3 (indirect, fixed in 3.14.4); 3 more of lower severity or without a fix
- pass `deps.mcp_sdk_version`: mcp 2.2.0, no known advisory
- pass `deps.resolvable`: steadyfetch@0.1.1 resolved: 108 packages

- tools: 5, about 637 tokens to load them all
- tool set hash: cd88e123e356529089f91d4a70406455
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.carsonroell-debug/steadyfetch.svg)](https://protogrid.dev/servers/io.github.carsonroell-debug/steadyfetch)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Dependencies

- pypi steadyfetch@0.1.1: resolved, 107 dependencies, MCP SDK mcp 2.2.0
  - GHSA-2g87-pp6c-29x5 (high) in `` aiohttp@3.14.3 ``, indirect, fixed in `` 3.14.4 ``, advisory summary: "aiohttp: Multiple instances of excessive or unbounded memory/CPU use" https://osv.dev/vulnerability/GHSA-2g87-pp6c-29x5
  - GHSA-5wr8-gcqf-gqf3 (high) in `` aiohttp@3.14.3 ``, indirect, fixed in `` 3.14.4 ``, advisory summary: "aiohttp server lacks an initial request/header timeout" https://osv.dev/vulnerability/GHSA-5wr8-gcqf-gqf3
  - GHSA-8mgp-746c-j5xp (high) in `` nltk@3.10.3 ``, indirect, no fix yet, advisory summary: "NLTK: Model-artifact APIs bypass pathsec and touch files outside allowed roots" https://osv.dev/vulnerability/GHSA-8mgp-746c-j5xp
  - GHSA-w8v5-vhqr-4h9v (moderate) in `` diskcache@5.6.3 ``, direct, no fix yet, advisory summary: "DiskCache has unsafe pickle deserialization" https://osv.dev/vulnerability/GHSA-w8v5-vhqr-4h9v
  - GHSA-494j-54xm-rwp3 (low) in `` aiohttp@3.14.3 ``, indirect, fixed in `` 3.14.4 ``, advisory summary: "AIOHTTP: Secure attribute not enforced for shared cookie" https://osv.dev/vulnerability/GHSA-494j-54xm-rwp3

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0.

## Remotes

- https://steadyfetch-production.up.railway.app/mcp (streamable-http, auth none, reachable false, uptime30d 0.92771083)

## Packages

- pypi steadyfetch@0.1.1

## Tools (5)

- `cache_stats`: Get cache statistics — size and item count.

    Useful for monitoring cache utilization and deciding when to clear.
    
- `check_domain`: Check the health status of a domain.

    Returns the circuit breaker state: 'closed' (healthy), 'open' (failing),
    or 'half_open' (testing recovery). Use this before batch operations to
    avoid wasting time on domains that are down.

    Args:
        domain: The domain to check (e.g., 'example.com')
    
- `clear_cache`: Clear the entire fetch cache.

    Use when you need fresh data and don't want to rely on cached results.
    
- `fetch_markdown`: Fetch a URL and return clean markdown text optimized for LLM consumption.

    Same reliability as fetch_url but returns only the markdown content,
    stripping HTML, scripts, and noise. Best for when you need the page
    content for analysis, summarization, or data extraction.

    Args:
        url: The URL to fetch
        use_cache: Whether to use cached results (default: true)
        wait_for: CSS selector to wait for before capturing
    
- `fetch_url`: Fetch a URL with full reliability — retry, circuit breaker, cache, and anti-bot bypass.

    Returns both raw HTML and clean markdown. Automatically retries on failure
    with exponential backoff, falls back to plain HTTP if browser fetch fails,
    and circuit-breaks domains that are consistently down.

    Args:
        url: The URL to fetch
        use_cache: Whether to use cached results (default: true, TTL 1 hour)
        js_render: Whether to render JavaScript (default: true, disable for speed)
        wait_for: CSS selector to wait for before capturing (e.g., '.results-loaded')
    
