# Rattlewatch

> Cited US recall lookup for AI agents: CPSC and FDA data, nothing invented.

- name: io.github.veritylabsai/rattlewatch
- version: 0.2.1
- connection class: R0 (autonomous)
- trust: 97/100
- quality: 89/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.veritylabsai%2Frattlewatch
- tools: https://api.protogrid.dev/v1/servers/io.github.veritylabsai%2Frattlewatch/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "rattlewatch": {
      "type": "http",
      "url": "https://rattlewatch.rattled.ca/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 100
- provenance: 90
- drivers: +repository +namespace-matches-repo +website +reachable +uptime-100% +updated-29d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 89/100 (good)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### 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: 86 (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
- pass `tools.annotations`: 4 of 4 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: list_changes (openWorldHint); verify (openWorldHint); search_recalls (openWorldHint); …
- pass `tools.token_cost`: about 567 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: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 4, about 567 tokens to load them all
- tool set hash: 69a0a80e17bcb5c2ce9d93a071ce83d7
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.veritylabsai/rattlewatch.svg)](https://protogrid.dev/servers/io.github.veritylabsai/rattlewatch)
- 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._

## Remotes

- https://rattlewatch.rattled.ca/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (4)

- `get_requirement`: Get cited market-entry requirements for a product subject in a given market (e.g. subject='childrens_products', market='US'). This is a small curated set, not a full regulatory database: CPC, CPSC eFiling, EU GPSR, CE marking, REACH SVHC, RoHS and California Prop 65. Returns each fact with its official citation URL and last-verified date.
- `list_changes`: List recall and requirement changes since an ISO-8601 timestamp (e.g. '2026-09-01T00:00:00+00:00'). Includes newly published recalls and rule changes, each with its source URL.
- `search_recalls`: Search official US recall records by product name, brand, model, or UPC. Covers CPSC consumer products and FDA food, drug and device enforcement. Returns only cited records from the store, each with a source URL and a match score. If nothing matches, returns an empty list rather than guessing.
- `verify`: Check a claim or product query against the store. Returns only cited records (recalls and requirements) that match. Explicitly reports 'no verified record' when nothing matches -- it never synthesizes an answer, so absence means 'not in the store', not a negative claim.
