{
  "markdown": "<img src=\"assets/redra-icon-white-rounded.svg\" alt=\"Redra\" width=\"96\">\n\n# Redra MCP\n\nRedra is an open-source Model Context Protocol server that searches current\nclass-action settlement records. It works with any MCP client and supports two\ndeployment choices:\n\n1. Use the hosted Redra MCP and dataset (recommended).\n2. Self-host both the MCP and a local copy of Redra's published dataset.\n\nRedra identifies possible keyword matches. It does not determine legal\neligibility, submit claims, or provide legal advice.\n\n## Data source and license\n\nDuring the technical beta, local mode defaults to the public SettleSignal JSON\nfeed at `https://settlesignal.com/data/settlements.json`. SettleSignal identifies\nits [Hugging Face dataset card](https://huggingface.co/datasets/katana957/us-settlement-catalog)\nas an official profile, and that card licenses the feed's public fields under\n[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Redra preserves source\nattribution and links while normalizing fields and adding derived lifecycle and\nquality metadata.\n\nRedra also supports its independently assembled, content-addressed `open` and\n`upcoming` publication format. That publication remains in a gated shadow beta;\nit is not the fresh-install default until its launch checks pass. Every imported\nindependent record must have independent discovery lineage and Tier A or B\nprovenance, and a failed validation leaves the prior local snapshot untouched.\n\n`open` records have a currently usable filing endpoint. `upcoming` records require\nevidence of a future claim window but have no current claim form. They are exposed\nonly as a watchlist and are excluded from the open count and claimable-money total.\nThe normalized factual compilation is published under\n[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Search results preserve\nofficial source links and carry source and change attribution. See\n[NOTICE.md](NOTICE.md).\n\nThe provider is explicit and is never inferred from a downloaded payload. Set\n`REDRA_DATASET_PROVIDER=independent` to consume Redra's publication, or leave it\nas `settlesignal` during the transition. `REDRA_DATASET_URL` can override the\nselected provider's default URL.\n\nNo settlement data is committed to this repository.\n\n## Hosted service (public preview)\n\nThe project currently operates this optional public service:\n\n- Website: `https://redra.ai/`\n- Documentation: `https://redra.ai/docs`\n- Hosted MCP: `https://mcp.redra.ai/mcp`\n- Privacy policy: `https://redra.ai/privacy`\n\nThe operational database behind the hosted MCP is private, has no public Fly route,\nand is reachable only by the hosted MCP over authenticated internal networking.\nThe MCP currently requires no user API key. It does not impose a per-IP quota,\nbecause hosted AI clients can send many unrelated users through shared network\naddresses. Availability is provided on a best-effort basis without an uptime,\ncompleteness, or fitness-for-eligibility guarantee.\n\nThe Redra application does not persist prompts, profile data, or MCP tool\narguments. The hosted MCP receives only tool arguments, not an agent's complete\nconversation. Hosting infrastructure may retain ordinary operational metadata,\nsuch as timestamps and request paths, in short-lived access logs. The hosted MCP\nstores each network-source IP address with a cumulative count of MCP work units\nfor aggregate usage measurement; items in a batch count individually. A network\nsource may be shared provider infrastructure and is not treated as a Redra user\nidentity or quota key. Search\nterms and tool arguments are not associated with that counter. Self-hosted Redra\ndoes not enable this hosted usage counter.\n\n## Option 1: hosted MCP and dataset (recommended)\n\nConnect a Streamable HTTP MCP client to the URL published by the Redra service,\ncurrently:\n\n```text\nhttps://mcp.redra.ai/mcp\n```\n\nNo local process or dataset is needed.\n\n## Option 2: self-hosted MCP and dataset\n\nPython 3.11 or newer is required. Clone and install Redra:\n\n```bash\ngit clone https://github.com/sacrosaunt/Redra.git\ncd Redra\npython -m venv .venv\nsource .venv/bin/activate\npip install -e .\n```\n\nThe project pins the current stable v1 line of the official Python MCP SDK with\n`mcp>=1.27,<2`. Version 2 was still prerelease when this release was built.\n\nDownload the settlement dataset and start the local MCP:\n\n```bash\nexport REDRA_DATABASE_PATH=\"$PWD/data/settlements.db\"\nredra-mcp dataset update\nredra-mcp serve --transport stdio\n```\n\nThe update is transactional: a failed download or invalid source payload leaves\nthe previous SQLite dataset intact. To keep a local dataset fresh automatically:\n\n```bash\nredra-mcp dataset watch --interval-hours 24\n```\n\nThis performs an update immediately and then once every 24 hours. It is optional;\nself-hosters can instead invoke `dataset update` from their existing cron system.\n\nTo expose the local MCP over Streamable HTTP:\n\n```bash\nexport REDRA_PORT=8000\nredra-mcp serve --transport streamable-http\n```\n\nThe MCP endpoint is `/mcp` and binds to `127.0.0.1` by default.\n\n> **Network safety:** Redra's HTTP transport does not provide authentication or\n> TLS. Do not bind it to `0.0.0.0` or publish port 8000 directly unless access is\n> protected by a trusted authenticated reverse proxy, firewall, or private network.\n\n### Docker\n\nStart the server and its once-daily updater:\n\n```bash\ndocker compose up --build\n```\n\nThe updater and MCP share the SQLite volume. The MCP remains available if a\nrefresh fails, and the previous valid snapshot stays in place. Compose publishes\nthe MCP only on the host loopback interface at `127.0.0.1:8000`.\n\n## MCP tools\n\n- `search_settlements`: keyword and structured-filter search.\n- `search_settlements_batch`: runs up to 50 independent searches in one MCP call\n  without changing the logical-AND meaning of each query's keywords. Records are\n  deduplicated across queries, and `matched_query_indices` preserves every search\n  angle that found each record.\n- `get_settlement`: fetches one record and its official source links, with agent\n  guidance to verify the complete eligibility terms when browsing is available.\n- `get_settlements`: fetches up to 20 finalist records together before the agent\n  composes its answer.\n- `get_dataset_info`: reports source, license, freshness, and counts.\n\nThe hosted provider also returns its cached claimable-money headline in dataset\ninfo. It is calculated only from records explicitly marked for inclusion in the\nclaimable total. Upcoming records never contribute. Self-hosted providers may\nreturn additional provider-specific aggregate metrics in the same `extra` object.\n\n### Search behavior\n\nEvery item in `keywords` is required (logical AND). Agents should use independent\nquery objects in `search_settlements_batch` for unrelated companies, products, or\nalternative terms. This preserves each query's meaning while avoiding a long series\nof MCP round trips.\n\nBatch search caps the unique records returned across all queries with\n`max_total_results`, which defaults to 50 and may be set as high as 100. The cap\ndoes not reduce the number of searches performed. Query summaries report each\nquery's total match count, sampled count, returned IDs, and omitted sampled count;\nthe unique records appear once in the top-level `items` list.\n\nFor broad eligibility scans, the MCP directs agents to search expansively across\nplausible brands, aliases, parent companies, subsidiaries, services, purchases,\nfees, and incidents recalled from the context the client makes available. It also\nconsiders eligibility-relevant demographic angles such as state, age group,\noccupation, student or veteran status, parent or guardian status, and housing or\nhousehold situation.\n\nRecalled or inferred associations are query candidates, not facts or eligibility\ndecisions, and queries must not contain identifying information. A category-level\nor demographic association alone is not enough to call a result a match.\n\nFor each plausible result, agents with web access are directed to inspect the\nofficial settlement or claim page for the class definition, qualifying dates,\nproducts or services, geographic limits, exclusions, proof requirements, and\ndeadline. Agents should compare only confirmed terms with context the user has\nmade available. Before composing the final answer, agents retrieve the complete\nstored record for every finalist with `get_settlement` or `get_settlements`.\nPlausible results are presented as concise lead cards showing why each surfaced,\nconfirmed matching terms, important unknowns, deadline, payout, proof requirement,\nand the official link when those fields are available. Evidence strength is ranked\nbefore urgency, with labels such as `Notice found`, `Strong possible match`, and\n`Needs your confirmation`; imminent deadlines remain prominent.\n\nA direct notice is strong evidence but does not prove every class condition. Agents\nask a focused non-sensitive follow-up before recommending action when one unknown\ncould change the recommendation. A candidate mentioned during progress receives an\nexplicit final disposition, and purely category-level or demographic candidates are\nkept out of the action list unless the user requests an exhaustive trace.\n\nAgents search and investigate before asking for more information. When\nnon-sensitive answers would materially clarify a lead, they prefer the client's\nnative structured-question or question-card interface. Clients without that\ninterface fall back to asking the same focused questions directly in chat.\nQuestions should explain why the answer matters, offer a `Not sure` or `Skip`\nchoice where appropriate, and never request identifying or sensitive information.\n\nAgents without browsing must say that they could not independently verify the\ncomplete terms, avoid guessing, and direct the user to the official link.\n\nClaim `status` defaults to `open`. The public MCP supports only `open` and\n`upcoming`. If a broad open scan produces no credible leads or only weak leads,\nagents may run focused `upcoming` searches for the strongest user-specific angles.\nUpcoming records are not yet claimable, are presented as a separate watchlist,\nand are excluded from current claim counts and money totals. Historical, payment,\nand uncertain lifecycle states remain internal rather than being exposed as public\nsearch options.\n\nThe provider's opaque verification tier is not a search filter. It is retained in\nresults as `source_verification_status` for transparency. Redra also returns\nobjective `source_kind`, `source_checked_at`, `claim_url_available`,\n`claimability`, and `quality_flags`. A source label such as `Verified record` is\nconverted to an open or closed lifecycle when its deadline makes that\ndetermination possible.\n\nUse the exact `settlement_type` filter instead of keywords when searching by type:\n`class_action_settlement`, `consumer_product_settlement`,\n`data_breach_settlement`, `financial_fee_settlement`, `government_refund`,\n`other_consumer_compensation`, `privacy_settlement`,\n`regulatory_compensation_program`, or `state_ag_refund`. Keywords intentionally\ndo not search the `settlement_type` field.\n\nOther filters include state, proof requirement, deadline range, and result limit.\nAn empty `applicable_states` list is treated as nationwide.\n\n## Environment variables\n\n| Variable | Purpose | Default |\n| --- | --- | --- |\n| `REDRA_DATABASE_PATH` | Local SQLite database | platform data directory |\n| `REDRA_DATASET_PROVIDER` | Dataset contract: `settlesignal` or `independent` | `settlesignal` |\n| `REDRA_DATASET_URL` | URL override for the selected provider | provider-specific default |\n| `REDRA_REQUEST_TIMEOUT` | HTTP timeout in seconds | `20` |\n| `REDRA_HOST` | Streamable HTTP bind address | `127.0.0.1` |\n| `REDRA_PORT` / `PORT` | Streamable HTTP port | `8000` |\n| `REDRA_RATE_LIMIT_PER_HOUR` | Streamable HTTP requests allowed per IP; `0` disables | `0` |\n| `REDRA_TRUST_FLY_HEADERS` | Trust Fly's client-IP header | `false` |\n| `REDRA_MAX_CONCURRENT_REQUESTS` | Maximum in-flight HTTP requests; `0` disables | `0` |\n| `REDRA_MAX_REQUEST_BODY_BYTES` | Maximum Streamable HTTP request-body size; `0` disables | `1048576` |\n| `REDRA_SEARCH_CACHE_TTL_SECONDS` | In-process normalized search-cache lifetime; `0` disables | `30` |\n| `REDRA_SEARCH_CACHE_MAX_ENTRIES` | Maximum in-process search-cache entries; `0` disables | `512` |\n\nPer-IP rate limiting is disabled by default. It should not be used as a per-user\nquota behind ChatGPT, Claude, or another hosted client because unrelated users may\nshare provider egress addresses. Operators that understand their direct network\ntopology can still enable it explicitly. Arbitrary `X-Forwarded-For` values are\nnever trusted. Local stdio mode is never rate-limited.\n\nOnly enable `REDRA_TRUST_FLY_HEADERS` when the process is actually behind Fly's\ntrusted proxy path. Enabling it behind an arbitrary proxy can allow clients to\nspoof the address used for rate limiting.\n\nThe hosted MCP instead uses bounded request bodies, a concurrency cap, a short\nbounded cache for identical normalized searches, and a centralized emergency\nceiling on aggregate work units. Batch items count individually toward that ceiling.\nCache keys are per-process keyed digests and\ncached values contain public settlement results rather than submitted query\narguments. The emergency ceiling is a service-wide circuit breaker, not a user\nquota. Its dataset service is not exposed to public callers and uses separate\ninternal concurrency protection.\n\n## Privacy and safety\n\nDo not submit names, email addresses, street addresses, account numbers, health\ndetails, claim identifiers, or other identifying information. Search with brand,\nproduct, employer, service, incident, date-range, and state information. Always\ndirect users to the official administrator before they provide claim information.\nThe hosted service is designed not to persist prompts, profiles, or tool\narguments, but self-host the MCP and dataset when control over the complete\nrequest path is required.\n\n## Development\n\n```bash\npip install -e '.[dev]'\npytest\n```\n\nPlease report vulnerabilities privately as described in [SECURITY.md](SECURITY.md).\n",
  "bytes": 14171,
  "sha": "6668c2beb5f12a74d3c36bff8d71aa3577c6871315d2a2209cd09deb01164a7f",
  "repo_slug": "sacrosaunt/redra",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_sacrosaunt_redra_a7596c28/readme"
}