Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,552Letters: 14Defects: 1,323counted just now
teppi

Server definition

Hash
sha256:87ea6b5de12618a8638f7f75e30c88435a0a0ca1228f03b94503799a9cc3f35b
What it is
What a remote MCP server returned when asked what it offers: 8 tools

The blob, as servednamed by its sha256

{ "instructions": null, "tools": [ { "description": "Search merchants/shops by free-text query (name or domain fragment), optionally filtered by country (ISO 3166-1 alpha-2, e.g. \"DE\") and/or by an EXACT category slug. 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. `category`, if given, must be one of the slugs returned by `list_categories` — call that tool first, do not guess a slug; an unrecognized slug is rejected with an error (never a silent empty `results`). `category` is additive to `query` (AND, not OR) — pass `query: \"\"` to browse a category without a name/domain filter. If many shops match, grouping by country or category keeps the list scannable.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "category": { "maxLength": 128, "type": "string" }, "country": { "maxLength": 512, "type": "string" }, "limit": { "maximum": 100, "minimum": 1, "type": "integer" }, "offset": { "minimum": 0, "type": "integer" }, "query": { "maxLength": 512, "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "find_shop", "outputSchema": null }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "country": { "maxLength": 512, "type": "string" }, "shop_domain": { "description": "Shop domain, e.g. \"otto.de\". An internal OpenShopGraph shop id is accepted here as well. The older field name `shop_id_or_domain` still works on every tool and means exactly the same thing.", "maxLength": 512, "type": "string" } }, "required": [ "shop_domain" ], "type": "object" }, "name": "get_shipping_policy", "outputSchema": null }, { "description": "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).", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "shop_domain": { "description": "Shop domain, e.g. \"otto.de\". An internal OpenShopGraph shop id is accepted here as well. The older field name `shop_id_or_domain` still works on every tool and means exactly the same thing.", "maxLength": 512, "type": "string" } }, "required": [ "shop_domain" ], "type": "object" }, "name": "get_shop", "outputSchema": null }, { "description": "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. Unlike every other tool on this page, this one requires a valid `x-api-token` header — a call without one fails before reaching this tool (401, no exceptions for anonymous/public callers).", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "shop_domain": { "description": "Shop domain, e.g. \"otto.de\". An internal OpenShopGraph shop id is accepted here as well. The older field name `shop_id_or_domain` still works on every tool and means exactly the same thing.", "maxLength": 512, "minLength": 1, "type": "string" } }, "required": [ "shop_domain" ], "type": "object" }, "name": "get_trust", "outputSchema": null }, { "description": "Enumerate the shop category taxonomy: every category slug currently carried by at least one public shop, together with how many public shops carry it. Call this BEFORE passing `category` to find_shop — the taxonomy is flat (no parent/child hierarchy, e.g. \"fashion\" and \"womens-clothing\" are siblings, not nested) and its slugs come from observed data, not a fixed enum baked into this tool, so a slug cannot be reliably guessed. `find_shop(category: <slug>)` only accepts a slug returned here; giving it anything else fails with an error instead of silently returning no results. Coverage measured 2026-09-03: 171 slugs across 3036 of 3100 active shops (97.9%) — a shop can carry more than one category, so counts do not sum to the total shop count.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": {}, "type": "object" }, "name": "list_categories", "outputSchema": null }, { "description": "List currently USABLE discount codes/coupons, optionally filtered by shop_domain (e.g. \"otto.de\"). A code is withheld from `results` when it is EXPIRED (valid_until has passed), when a real checkout test PROVED it does not work (verification_status \"verified_rejected\"), or when a display policy suppresses it on this channel/country. Nothing is withheld silently: `total_count` is how many codes the query found before any of that, and `withheld` breaks the difference down by reason ({expired, verified_rejected, reserved_test_domain, policy}) — total_count minus results.length always equals the sum of `withheld`, and `note` states the same balance in one sentence. So an empty `results` NEVER has to be guessed at: read `total_count` and `note` to tell \"this shop has no codes at all\" apart from \"it has codes and every one of them is proven dead\". An UNKNOWN or internal-review shop_domain is a different answer again — it is an error (\"shop not found\"), not an empty list; and a backend failure is reported as a failure, never as an empty list. 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. 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; \"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. (\"verified_rejected\" is defined as before but no longer appears in `results` — it is counted in `withheld.verified_rejected` instead.) 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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "shop_domain": { "maxLength": 512, "type": "string" } }, "type": "object" }, "name": "list_coupons", "outputSchema": null }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "code": { "maxLength": 64, "minLength": 1, "type": "string" }, "reason": { "enum": [ "invalid", "mismatch", "item_restricted", "min_order_missing" ], "type": "string" }, "shop_domain": { "maxLength": 253, "minLength": 1, "type": "string" } }, "required": [ "shop_domain", "code", "reason" ], "type": "object" }, "name": "report_code", "outputSchema": null }, { "description": "Record a shop-level or data-fact issue as one fixed, documented reason (no free text). subject_type \"shop\": unreachable | no_longer_exists | info_outdated | wrong_category | wrong_name_or_domain. subject_type \"fact\": shipping_cost | return_period | payment_methods | evidence_broken. Same write semantics as report_code: appends one report row, never changes delivered data directly, only queues a re-check subject to per-source dedup.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "reason": { "enum": [ "unreachable", "no_longer_exists", "info_outdated", "wrong_category", "wrong_name_or_domain", "shipping_cost", "return_period", "payment_methods", "evidence_broken" ], "type": "string" }, "shop_domain": { "maxLength": 253, "minLength": 1, "type": "string" }, "subject_type": { "enum": [ "shop", "fact" ], "type": "string" } }, "required": [ "subject_type", "shop_domain", "reason" ], "type": "object" }, "name": "report_issue", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:87ea6b5de12618a8638f7f75e30c88435a0a0ca1228f03b94503799a9cc3f35b | sha256sum