# Offers MCP — agent contract

Deep purchase intelligence for agents, applications, and humans.
Endpoint: https://offers-engine.dexter-works.com/mcp (streamable HTTP, no auth)
REST mirror: /api/search_offers?q=<product>&zip=<zip> (identical JSON)

## Tools
- search_offers(query, zip?) — product (free text or GTIN/UPC/EAN) -> normalized offers.
- report_feedback(query, verdict, note?) — tell us when a result was wrong or great.

## How to interpret responses
- summary.recommendation is the honest headline. If it starts with "Low-confidence",
  do NOT present offers as a confident answer; ask the user to clarify the product.
- product.resolution_confidence (0-1): how sure we are the query resolved to this product.
- offers[].variant_match.confidence (0-1): how well THIS offer matches. Hedge below 0.6.
- offers[].fulfillment.landed_cost is the comparison number (price + shipping).
- merchant.trust.score (0-100): curated merchant trust. best_offer only considers trusted merchants.
- provenance.checked_at + cache tell you data freshness. Never claim fresher than this.
- listing.affiliate_url, when present, is the same destination with affiliate tracking
  (disclosed in meta.disclosure). Ranking is commission-blind: trust and landed cost decide.

## Rules we follow (and you should relay)
- Null over guessed: a field we cannot verify is null, not invented.
- Preserve the user's explicit constraints (model numbers, sizes, colors) — if the
  resolved product differs from what the user named, say so.
- Fair use: ~10 fresh lookups/visitor/day; cached lookups unlimited. Capacity messages
  are returned honestly in sources_failed.

Feedback: report_feedback tool, or https://github.com/dexterworks/offers-mcp/issues
