Connection check
verified live · 28h ago
openshopgraph-mcp
Open, verified shop database for AI agents: products, offers, price comparison, trust and coupons.
Tools
7
GitHub stars
—
Installs / wk
—
Licence
—
Transport
streamable-http
Last checked
28h ago
Tools & capabilities
7 toolsRead from the running server on 28h ago.
find_shop
read-only
limitquery*offsetcountry
Search merchants/shops by free-text query (name or domain fragment), optionally filtered by country (ISO 3166-1 alpha-2, e.g. "DE"). Returns the public shop view only — shops still… Search merchants/shops by free-text query (name or domain fragment), optionally filtered by country (ISO 3166-1 alpha-2, e.g. "DE"). Returns the public shop view only — shops still under internal review are never returned. `results` carries at most `limit` entries (default 50, max 100); `total_count` is the full match count before that cap and `truncated` is true when more results exist beyond this page — raise `offset` (default 0) to page through them. Multi-word queries are matched conjunctively: every word must be evidenced on a shop (name, domain or category). `ignored_terms` lists the words that matched nothing anywhere in the corpus and were therefore dropped to avoid an empty answer — a non-empty `ignored_terms` means the results answer a NARROWER question than you asked, so do not present them as satisfying those words. `category_truncated` is true when category resolution hit its internal cap and the match set is a subset. If many shops match, grouping by country or category keeps the list scannable.
get_shipping_policy
read-only
countryshop_domain*
What a shop STATES about its own shipping: which destinations it names, the delivery time it claims, and any free-shipping threshold — plus the date that statement was last checked… What a shop STATES about its own shipping: which destinations it names, the delivery time it claims, and any free-shipping threshold — plus the date that statement was last checked and where it was read (policy_page or structured_data). This is a shop-level statement, NOT an offer and NOT a quote: it carries no carrier and no shipping price, because OpenShopGraph does not hold that data. Pass country (ISO 3166-1 alpha-2, e.g. "DE") to get a ships_to verdict derived from the stated destination list — "unknown" is a real answer there and means the statement does not settle it. When nothing has been collected for a shop, the reply says so explicitly (collected:false): that is a gap in the data, not a statement that the shop does not ship. Relaying the checked-at date alongside any figure keeps a stale merchant claim from being read as a current fact.
get_shop
read-only
shop_domain*
Fetch a single merchant/shop by id or domain (public view). Returns "shop not found" for shops still under internal review, identical to a genuinely unknown domain — reviewers cann… Fetch a single merchant/shop by id or domain (public view). Returns "shop not found" for shops still under internal review, identical to a genuinely unknown domain — reviewers cannot be distinguished from typos. The offers array is present for schema stability but empty until merchant offers are ingested (Offer table measured empty on 2026-07-30).
get_trust
read-only
shop_domain*
Trust-relevant facts OpenShopGraph itself measured about one merchant/shop (by id or domain): TLS certificate issuer and grade, hosting ISP and country, domain registration date, r… Trust-relevant facts OpenShopGraph itself measured about one merchant/shop (by id or domain): TLS certificate issuer and grade, hosting ISP and country, domain registration date, registrar, and accepted payment methods. Returns INDIVIDUAL signals, never an aggregate: every entry carries its own value, `source` (where OpenShopGraph observed it) and `checked_at` (when). There is deliberately no score, rating, percentage or star value — not even an internally computed one; you are given the raw evidence and judge for yourself. A field with no source or no check timestamp is omitted entirely rather than shipped with a null placeholder. If nothing was measured, the answer is status "no_signals_collected" with an empty list — that means NOTHING IS KNOWN, it is not a score of zero and not a negative verdict. Unknown domains, shops under internal review and measured-but-empty shops are intentionally indistinguishable here. `signal_coverage` describes data completeness, not merchant trustworthiness: `present`/`total` count how many of the (up to 7) signal fields OpenShopGraph was able to deliver for this shop, and `missing` lists the rest, each with a `reason` — `not_collected_yet` (OpenShopGraph has never run that check for this shop) or `pipeline_gap` (the check ran — source and timestamp exist — but produced no usable value, e.g. an IP/ASN lookup that resolves a hosting ISP but not a country). A low `present` count is NOT evidence of a low-quality or risky merchant: it usually just means one of OpenShopGraph's own probes came back empty. Do not treat `signal_coverage` as a rating, and do not rank or filter merchants by it as if it were one.
list_coupons
read-only
shop_domain
List currently visible discount codes/coupons, optionally filtered by shop_domain (e.g. "otto.de"). Only publicly displayable coupons are returned — internal/candidate-shop or poli… List currently visible discount codes/coupons, optionally filtered by shop_domain (e.g. "otto.de"). Only publicly displayable coupons are returned — internal/candidate-shop or policy-suppressed codes are excluded, and EXPIRED codes are never returned (a code whose valid_until has passed is withheld). Each result carries validUntil: an ISO timestamp when the code has a stated expiry, or null when it is open-ended — null means unlimited, NOT unknown-and-expired. Re-check validUntil against the current time before relaying a code; including the shop domain and the expiry avoids sending users to codes that will not apply for them. Each result ALSO carries verificationStatus, the verdict of a real checkout test against this exact code: "verified_applied" means the code was proven to work by an actual checkout attempt with proof on file — safe to recommend; "verified_rejected" means the code was proven NOT to work by an actual checkout attempt — do NOT recommend it; "unverified" means no proof exists either way yet — treat it as unknown, NOT as a negative signal, and do not imply it was tested and failed. lastVerifiedAt is the ISO timestamp of that most recent test, or null if the code was never tested. A non-null lastVerifiedAt on an "unverified" code means it WAS tested but the test was inconclusive — it is not the same as a code that was never attempted.
report_code
code*reason*shop_domain*
N5 (2026-08-23): Record that a specific shop_domain + code (coupon) pair is wrong in one of four fixed, documented ways (invalid | mismatch | item_restricted | min_order_missing —… N5 (2026-08-23): Record that a specific shop_domain + code (coupon) pair is wrong in one of four fixed, documented ways (invalid | mismatch | item_restricted | min_order_missing — see reasons enum; no free text anywhere). This is a write: it appends one new report row and NEVER changes the delivered coupon directly — it never deletes or overwrites data, and it does not itself decide anything. Subject to per-source dedup it only queues a re-check (RecheckQueueEntry); only a separate Pruefurteil process may later change what list_coupons returns. Reply is a status text ('wird gemeldet, Pruefung laeuft'), never a verdict.
report_issue
reason*shop_domain*subject_type*