mcpbeat Sign in

OpenShopGraph MCP Server

by openshopgraph Your server? Claim it
answering

OpenShopGraph is answering right now. Last checked 12 min ago. It exposes 8 tools.

Open, verified shop database for AI agents: products, offers, price comparison, trust and coupons.

Uptime history 67 days of history · worst day 37%
67 days agonow
100.0%
Uptime 24h
92 of 92 checks
8
Tools
read from the server
202 ms
Response time
average over 24h
open, no key
Access
streamable-http

What changed 23

Every tool that appeared, vanished or quietly changed what it asks for. Recorded since 12 August 2026. No other catalogue keeps this.

5 Oct a tool description was rewritten list_coupons
5 Oct a tool changed the parameters it asks for list_coupons
4 Oct a tool description was rewritten list_coupons
13 Sep a tool description was rewritten list_coupons
5 Sep 4 tool descriptions were rewritten find_shop, get_trust, report_code and 1 more
5 Sep a tool changed the parameters it asks for find_shop
5 Sep a tool appeared list_categories
5 Sep a tool changed version
3 Sep 2 tool descriptions were rewritten get_trust, list_coupons
25 Aug a tool appeared report_issue
and 9 more, back to 12 August 2026

Nothing serious here today

Today is the operative word: we check OpenShopGraph every 15 minutes and re-read its code on every release. Watch it and you find out the day that stops being true.

Three servers free · no card

Connect this server

Endpoint below is the one we actually reach during checks — not the one copied from a README. Last verified 12 min ago.

run in your terminal
claude mcp add mcp --transport http https://api.openshopgraph.com/mcp
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "mcp": {
      "url": "https://api.openshopgraph.com/mcp"
    }
  }
}
~/.codex/config.toml
[mcp_servers.mcp]
url = "https://api.openshopgraph.com/mcp"
.cursor/mcp.json
{
  "mcpServers": {
    "mcp": {
      "url": "https://api.openshopgraph.com/mcp"
    }
  }
}
.vscode/mcp.json
{
  "mcpServers": {
    "mcp": {
      "url": "https://api.openshopgraph.com/mcp"
    }
  }
}

Available tools 8

Read directly from the server with tools/list, grouped by what they act on. If a tool disappears, we record the date.

report
report_code
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
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.
shop
find_shop
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.
get_shop
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).
categories
list_categories
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.
coupons
list_coupons
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 the REAL number of codes the query found before any of that (for the collection list the full count over everything, never just the window), `examined` is how many codes this call looked at, and `withheld` breaks the difference down by reason ({expired, verified_rejected, reserved_test_domain, policy}) — examined minus results.length always equals the sum of `withheld`, and `note` states the same balance in one sentence. WITHOUT shop_domain the call returns one window of at most `limit` codes (default 100, max 100) starting at `offset` (default 0), ordered by a stable id: `truncated` is true when more codes lie beyond it and `next_offset` is the offset to pass for the next page (null on the last page) — page until `truncated` is false to see every code. limit/offset are rejected together with shop_domain, which already returns every code of that shop. 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 worked in an actual checkout attempt — safe to recommend (the response carries no stored proof artifact, so do not promise a screenshot or receipt); "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.
shipping
get_shipping_policy
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.
trust
get_trust
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).

Endpoints

URLTransportStateLatencyChecked
https://api.openshopgraph.com/mcp streamable-http answering 226 ms 12 min ago

Alternatives to OpenShopGraph

same job, measured the same way
Airtable
by airtable

Official Airtable MCP server — database and operations layer for agents.

answering
Thingery
by thingery

Open item database and MCP server for AI agents to list, find, and trade second-hand goods.

386 installs/wk local only
Docker MCP Server
by hypnosis

Docker for AI agents — containers, compose stacks, logs and databases, locally or over SSH.

239 installs/wk local only
memoric
by memoric

Provenance-first database for teams and agents: every value carries sources, rules and coverage.

answering
SVTR AI Venture Database
by svtr

Curated & traceable AI venture data: verified funding events, org & founder profiles, US + China

8 tools answering
Parseium
by parseium

Web scraping runtime for agents: parsers, scrapes, batches, crons, and SQL databases.

answering
Global Database
by globaldatabase

Verified company profiles, financials, ownership, registry records and business contacts.

answering
SchemaBrain
by arun-kc

The trust and intelligence layer between AI agents and your database.

82 installs/wk local only

OpenShopGraph — questions

Answers built from our own checks of this server.

What can OpenShopGraph do?
It exposes 8 tools, read directly from the server on our last check. Among them: find_shop, get_shipping_policy, get_shop, get_trust, list_categories, list_coupons and 2 more. The full list with descriptions is on this page — we take it from the server itself via tools/list, not from a README. How MCP servers expose tools in the first place →
What is OpenShopGraph mostly used for?
Its tools cluster around shop and report. That is what this server is built to work with — the grouping comes from the actual tool names, not from a category we assigned.
Is OpenShopGraph working right now?
We send a real MCP handshake every 15 minutes. Over the last 24 hours 92 of 92 checks got a reply (100.0%), average response time 202 ms. The bar chart above shows every period we have measured.
How do I connect OpenShopGraph?
Copy the ready config from this page — we generate it for Claude Code, Claude Desktop, Codex, Cursor and VS Code, each with the file path that client actually reads. It is a remote server, so there is nothing to install — the client connects to the address.
Does OpenShopGraph need an API key?
No. OpenShopGraph completed a full MCP handshake with us as an anonymous client and listed its tools without asking for anything. All 8 of them are readable on this page. This is what we observed, not what the docs claim.
How fast is OpenShopGraph?
It answers our handshake in 202 ms on average, which is faster than 61% of all working MCP servers we measure. The comparison comes from our own checks across the whole registry, every 15 minutes.