{"id":"37ce7d18-b520-4905-ab87-fc7f7cb0b5f7","entityType":"agent","slug":"clawhub-chrischall-groupon-mcp","name":"groupon-mcp","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chrischall-groupon-mcp","canonicalPath":"/agent/clawhub-chrischall-groupon-mcp","generatedAt":"2026-10-10T08:44:55.466Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T03:17:56.546Z","emptyReason":null},"description":"Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers. Skill: groupon-mcp Owner: chrischall Summary: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers. Tags: latest:1.1.6 Version history: v1.1.6 | 2026-10-09T23:25:52.079Z | auto - Removed the skill-card.md file. - No ch","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:groupon-mcp","sourceUrl":"https://clawhub.ai/chrischall/groupon-mcp","homepage":"https://clawhub.ai/chrischall/skills/groupon-mcp","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chrischall/groupon-mcp","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chrischall/skills/groupon-mcp","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or l"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:17:56.546Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:17:56.546Z","emptyReason":null},"stars":null,"forks":null,"downloads":1741,"packageName":null,"latestVersion":"1.1.6","tractionLabel":"1.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:17:56.546Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T03:17:56.546Z","lastCrawledAt":"2026-10-10T03:17:56.546Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T03:17:56.546Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.6","createdAt":"2026-10-09T23:25:52.079Z","changelog":"- Removed the skill-card.md file. - No changes to core functionality or documentation.","fileCount":4,"zipByteSize":4595},{"version":"1.1.5","createdAt":"2026-10-07T13:35:10.291Z","changelog":"- Removed the file skill-card.md. - No changes to functionality or documentation, aside from file cleanup.","fileCount":4,"zipByteSize":4571},{"version":"1.1.4","createdAt":"2026-10-05T02:51:04.643Z","changelog":"- Removed the skill-card.md file. - No changes to core functionality or documentation in SKILL.md.","fileCount":4,"zipByteSize":4587},{"version":"1.1.3","createdAt":"2026-10-03T01:43:37.001Z","changelog":"- Removed the file: skill-card.md. - No changes to the core logic or documentation content. - Maintenance update for file cleanup.","fileCount":4,"zipByteSize":4609},{"version":"1.1.2","createdAt":"2026-09-28T13:55:27.775Z","changelog":"- Removed the file: skill-card.md. - No user-facing changes to functionality or documentation.","fileCount":4,"zipByteSize":4527},{"version":"1.1.1","createdAt":"2026-09-25T15:52:50.715Z","changelog":"- Removed the file skill-card.md. - No changes made to the core functionality or documentation in SKILL.md.","fileCount":4,"zipByteSize":4548},{"version":"1.1.0","createdAt":"2026-09-24T15:13:05.454Z","changelog":"- removed 1 file(s). - Updated SKILL.md and bundle contents.","fileCount":4,"zipByteSize":4725},{"version":"1.0.2","createdAt":"2026-09-23T21:39:45.491Z","changelog":"- Removed the skill-card.md file. - No changes to functionality or core documentation.","fileCount":4,"zipByteSize":4717}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:groupon-mcp","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T08:44:55.465Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-groupon-mcp/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T03:17:56.546Z","emptyReason":null},"readme":"Skill: groupon-mcp\n\nOwner: chrischall\n\nSummary: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n\nTags: latest:1.1.6\n\nVersion history:\n\nv1.1.6 | 2026-10-09T23:25:52.079Z | auto\n\n- Removed the skill-card.md file.\n- No changes to core functionality or documentation.\n\nv1.1.5 | 2026-10-07T13:35:10.291Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or documentation, aside from file cleanup.\n\nv1.1.4 | 2026-10-05T02:51:04.643Z | auto\n\n- Removed the skill-card.md file.\n- No changes to core functionality or documentation in SKILL.md.\n\nv1.1.3 | 2026-10-03T01:43:37.001Z | auto\n\n- Removed the file: skill-card.md.\n- No changes to the core logic or documentation content.\n- Maintenance update for file cleanup.\n\nv1.1.2 | 2026-09-28T13:55:27.775Z | auto\n\n- Removed the file: skill-card.md.\n- No user-facing changes to functionality or documentation.\n\nv1.1.1 | 2026-09-25T15:52:50.715Z | auto\n\n- Removed the file skill-card.md.\n- No changes made to the core functionality or documentation in SKILL.md.\n\nv1.1.0 | 2026-09-24T15:13:05.454Z | auto\n\n- removed 1 file(s).\n- Updated SKILL.md and bundle contents.\n\nv1.0.2 | 2026-09-23T21:39:45.491Z | auto\n\n- Removed the skill-card.md file.  \n- No changes to functionality or core documentation.\n\nv1.0.1 | 2026-09-23T15:43:36.917Z | auto\n\n- Removed the redundant file skill-card.md.\n- No changes to the underlying functionality or documentation in SKILL.md.\n\nv1.0.0 | 2026-09-20T02:49:09.484Z | auto\n\n- Initial release (v1.0.0) of the Groupon skill.\n- Allows searching, browsing, and retrieving details for Groupon deals from the terminal using the public GraphQL API.\n- No authentication, key, or login required.\n- Supports deal search by city, deal detail lookup, and category taxonomy queries.\n- Removed the skill-card.md file.\n\nv0.4.0 | 2026-09-17T23:37:20.197Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing changes to core skill functionality.\n\nv0.3.3 | 2026-09-15T19:26:57.261Z | auto\n\n- Removed the file skill-card.md.\n- No functional changes to skill behavior or documentation.\n\nv0.3.2 | 2026-09-14T14:07:02.669Z | auto\n\n- Removed the file skill-card.md.\n- No other functionality or documentation changes in this release.\n\nv0.3.1 | 2026-09-10T17:49:30.062Z | auto\n\n- Removed the file: skill-card.md\n- No changes were made to core functionality or documentation beyond this removal.\n\nv0.3.0 | 2026-09-04T22:21:01.897Z | auto\n\n- Removed the file skill-card.md. \n- No user-facing functionality changes; underlying skill behavior remains the same.\n\nv0.2.0 | 2026-08-29T14:07:15.748Z | auto\n\n- Removed the file skill-card.md.\n- No other changes to the skill's content or behavior.\n\nv0.1.7 | 2026-08-28T21:10:36.050Z | auto\n\n- Removed the skill-card.md file.\n- No feature or functionality changes; documentation cleanup only.\n\nv0.1.6 | 2026-08-28T11:34:45.102Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or documentation content.\n- Version bump to 0.1.6.\n\nv0.1.5 | 2026-08-09T21:02:40.320Z | auto\n\n- Removed the skill-card.md file.\n- No functional changes; documentation and operational details remain unchanged.\n\nv0.1.4 | 2026-08-06T00:42:47.687Z | auto\n\n- Removed the skill-card.md file.\n- No changes to core functionality or documentation content.\n\nv0.1.3 | 2026-08-03T04:33:38.665Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or user instructions.\n\nv0.1.2 | 2026-07-30T12:53:32.880Z | auto\n\n- Removed the file skill-card.md.\n- No changes to core functionality or documentation.\n\nv0.1.1 | 2026-07-27T21:15:44.693Z | auto\n\n- Removed the file skill-card.md.\n- No changes to skill behavior or API; documentation and functionality remain the same.\n\nv0.1.0 | 2026-07-27T03:11:27.172Z | auto\n\n- Initial release of groupon-mcp skill: search, browse, and detail Groupon deals via the public GraphQL API using curl.\n- Supports three main operations: browse city deals, fetch specific deal details, and retrieve category taxonomy.\n- Requires no login, API key, or cookies; works anonymously from the terminal.\n- Includes documentation for operation payloads, response handling, and troubleshooting API hash changes.\n\nArchive index:\n\nArchive v1.1.6: 4 files, 4595 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (1723b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.1.6:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.1.6:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.1.6\",\n  \"publishedAt\": 1791588352079\n}\n\nFile v1.1.6:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.1.6:skill-card.md\n\n## Description:\n\nHelps agents search Groupon deals, inspect deal details, and browse categories using public, read-only deal data.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nPeople and agents looking for Groupon offers can search by city or keyword, inspect a deal's pricing and fine print, and browse categories without signing in.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Groupon receives the searches, city slugs, and deal IDs submitted for lookup.\n\nMitigation: Share only lookup inputs you are comfortable sending to Groupon.\n\nRisk: Refreshing an expired query fingerprint from a browser request could expose account or session data if the entire request is copied.\n\nMitigation: Copy only the public sha256Hash value, not cookies, authorization headers, or personal account data.\n\n## Reference(s):\n\n- [Groupon query recipes](references/graphql-queries.md)\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/groupon-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance]\n\n**Output Format:** [Markdown with deal details and optional shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only deal lookups; no purchases or account access.]\n\n## Skill Version(s):\n\n1.1.6 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.5: 4 files, 4571 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (1680b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.1.5:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.1.5\",\n  \"publishedAt\": 1791380110291\n}\n\nFile v1.1.5:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.1.5:skill-card.md\n\n## Description:\n\nHelps agents search Groupon deals, inspect deal details, and browse categories using public, unauthenticated requests.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nAgents and their users can find local Groupon offers, compare deal details and prices, and browse available categories without signing in.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Deal search parameters are sent to Groupon when running the examples.\n\nMitigation: Share only intended search terms and locations; do not add cookies, sessions, or secrets to requests.\n\nRisk: Groupon may change query fingerprints or return a challenge instead of deal data.\n\nMitigation: Check responses before using results and refresh outdated public query fingerprints when needed.\n\n## Reference(s):\n\n- [Groupon MCP on ClawHub](https://clawhub.ai/chrischall/skills/groupon-mcp)\n- [Groupon curl recipes](references/graphql-queries.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Shell commands, Guidance]\n\n**Output Format:** [Markdown with curl and jq examples or concise deal summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Deal results and prices depend on Groupon's current data.]\n\n## Skill Version(s):\n\n1.1.5 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.4: 4 files, 4587 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (1719b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.1.4:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.1.4\",\n  \"publishedAt\": 1791168664643\n}\n\nFile v1.1.4:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.1.4:skill-card.md\n\n## Description:\n\nHelps agents search and read public Groupon deals, deal details, and categories using terminal commands without an account or API key.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nAgents and developers use this skill to find Groupon offers by city or search term, inspect deal details, and browse deal categories without making purchases.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Search terms, city slugs, and deal identifiers are sent to Groupon.\n\nMitigation: Avoid sensitive queries and share only the information needed for the lookup.\n\nRisk: Persisted queries may become stale or responses may be replaced by a challenge page.\n\nMitigation: Check responses before parsing and refresh the documented query fingerprints if Groupon reports they are unavailable.\n\n## Reference(s):\n\n- [Groupon MCP on ClawHub](https://clawhub.ai/chrischall/skills/groupon-mcp)\n- [Groupon curl recipes](artifact/references/graphql-queries.md)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Text, Guidance]\n\n**Output Format:** [Markdown with shell commands and deal summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only public deal information; no purchase or account actions.]\n\n## Skill Version(s):\n\n1.1.4 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.3: 4 files, 4609 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (1761b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1790991817001\n}\n\nFile v1.1.3:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.1.3:skill-card.md\n\n## Description:\n\nHelps agents search and read public Groupon deals, deal details, and categories using terminal curl recipes without an account or API key.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nAgents and users can find offers in a city, inspect a deal's prices and terms, and browse Groupon categories using public deal data.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Deal searches are sent to Groupon's public endpoint; adding credentials or purchase workflows would change the security posture.\n\nMitigation: Do not add cookies, account tokens, or purchase actions without separately reviewing and trusting the authenticated integration.\n\nRisk: Saved query fingerprints may expire, causing deal lookups to fail.\n\nMitigation: Check responses before relying on results and refresh stale fingerprints using the documented procedure.\n\n## Reference(s):\n\n- [Groupon curl recipes](references/graphql-queries.md)\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/groupon-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Shell commands, Guidance]\n\n**Output Format:** [Markdown with curl commands and deal summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Public deal reads; no account, cookies, or API key required.]\n\n## Skill Version(s):\n\n1.1.3 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.2: 4 files, 4527 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (1583b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1790603727775\n}\n\nFile v1.1.2:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.1.2:skill-card.md\n\n## Description:\n\nHelps agents search Groupon deals, inspect deal details, and browse categories using public, read-only requests without an account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nPeople and agents looking for local offers can search deals by city and keyword, review prices and deal details, or browse categories before deciding what to explore further.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Search terms, city slugs, and deal IDs are sent to Groupon when looking up offers.\n\nMitigation: Avoid sensitive searches if disclosing those details to Groupon is a concern.\n\n## Reference(s):\n\n- [Groupon MCP on ClawHub](https://clawhub.ai/chrischall/skills/groupon-mcp)\n- [Groupon curl recipes](references/graphql-queries.md)\n- [Groupon consumer API](https://www.groupon.com/mobilenextapi/graphql)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance]\n\n**Output Format:** [Deal summaries, links, and optional curl and jq commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Deal prices and availability may change; deal lookup does not purchase offers.]\n\n## Skill Version(s):\n\n1.1.2\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.1: 4 files, 4548 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (1627b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1790351570715\n}\n\nFile v1.1.1:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.1.1:skill-card.md\n\n## Description:\n\nHelps agents search and read Groupon deals, deal details, and categories using public, unauthenticated requests.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nAgents and their users can find deals in a city, inspect an individual deal's pricing and details, and browse Groupon categories without signing in.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Deal search terms are sent to Groupon.\n\nMitigation: Avoid sensitive personal information in search terms.\n\nRisk: Public query fingerprints can become stale, interrupting deal lookups.\n\nMitigation: Refresh the fingerprint from a current Groupon request when a persisted query is not found; do not treat it as a credential.\n\n## Reference(s):\n\n- [Groupon curl recipes](references/graphql-queries.md)\n- [Groupon MCP skill on ClawHub](https://clawhub.ai/chrischall/skills/groupon-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Shell commands]\n\n**Output Format:** [Markdown with deal summaries and curl examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Deal results depend on Groupon's current listings and public query availability.]\n\n## Skill Version(s):\n\n1.1.1 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.0: 4 files, 4725 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (2081b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1790262785454\n}\n\nFile v1.1.0:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.1.0:skill-card.md\n\n## Description:\n\nSearch and read Groupon deals from the terminal via curl -- the consumer GraphQL API for deal search, deal detail, and category taxonomy without a key or login.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use this skill to search public Groupon deals, inspect deal details, and browse Groupon category taxonomy from terminal-oriented workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Groupon searches, city slugs, and deal IDs are sent to Groupon when the curl recipes are used.\n\nMitigation: Use only for public deal lookup workflows where sending those query details to Groupon is acceptable.\n\nRisk: Persisted GraphQL query hashes can become stale after Groupon frontend changes.\n\nMitigation: Refresh the public persisted-query hash from a Groupon browser request when the API returns PersistedQueryNotFound.\n\nRisk: The skill provides read-only deal lookup recipes and does not cover authenticated purchases or account actions.\n\nMitigation: Do not use this skill for buying Groupons or handling account-specific workflows.\n\n## Reference(s):\n\n- [Groupon curl recipes](references/graphql-queries.md)\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/groupon-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Markdown, Configuration instructions, API Calls, Guidance]\n\n**Output Format:** [Markdown with inline bash, curl, jq, and JSON examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Outputs are read-only public deal data recipes; purchasing and account-specific actions are out of scope.]\n\n## Skill Version(s):\n\n1.1.0 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.2: 4 files, 4717 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (2003b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1790199585491\n}\n\nFile v1.0.2:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.0.2:skill-card.md\n\n## Description:\n\nSearch and read Groupon deals from the terminal via curl -- the consumer GraphQL API (deal search/browse, deal detail, category taxonomy).\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use this skill to search Groupon deals, inspect deal details, and browse category taxonomy through public curl-based GraphQL requests.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Groupon searches, city slugs, and deal IDs are sent to Groupon's API.\n\nMitigation: Use only public deal lookup terms and avoid private account, payment, cookie, or token data in requests.\n\nRisk: Persisted GraphQL query hashes can become stale and cause request failures.\n\nMitigation: Refresh only the public persisted-query fingerprint from a matching Groupon browser request when PersistedQueryNotFound occurs.\n\nRisk: Challenge interstitials or empty non-JSON responses can be returned by the upstream service.\n\nMitigation: Check response shape before parsing JSON and retry rather than blindly parsing empty or HTML responses.\n\n## Reference(s):\n\n- [Groupon curl recipes](references/graphql-queries.md)\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/groupon-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, markdown, shell commands, code]\n\n**Output Format:** [Markdown with curl and jq code blocks]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces public Groupon API request examples and parsing guidance; it does not provide credentials or persist data.]\n\n## Skill Version(s):\n\n1.0.2 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.1: 4 files, 4814 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (2191b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1790178216917\n}\n\nFile v1.0.1:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.0.1:skill-card.md\n\n## Description:\n\nSearch and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and external users use this skill to search Groupon deals, inspect deal details, and browse category taxonomy through public Groupon GraphQL curl recipes without account credentials.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Groupon search terms, city slugs, and deal identifiers are sent to Groupon's public API.\n\nMitigation: Use the recipes only for queries you are comfortable sharing with Groupon.\n\nRisk: Adding cookies, account tokens, or purchasing/session data would change the security posture of the workflow.\n\nMitigation: Keep requests anonymous unless a separately reviewed workflow explicitly requires authenticated Groupon access.\n\nRisk: Persisted GraphQL query hashes can become stale after Groupon frontend changes.\n\nMitigation: Refresh only the public persisted-query hash from a matching Groupon network request and avoid adding secrets.\n\n## Reference(s):\n\n- [Groupon curl recipes](references/graphql-queries.md)\n- [Groupon consumer GraphQL endpoint](https://www.groupon.com/mobilenextapi/graphql)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Markdown, Shell commands, API Calls]\n\n**Output Format:** [Markdown with inline bash, curl, jq, and JSON examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces public Groupon deal lookup guidance and command examples; it does not produce executable project files.]\n\n## Skill Version(s):\n\n1.0.1 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.0: 4 files, 4647 bytes\n\nFiles: references/graphql-queries.md (3542b), skill-card.md (1888b), SKILL.md (2504b), _meta.json (130b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth.\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1789872549484\n}\n\nFile v1.0.0:references/graphql-queries.md\n\n# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'\n```\n\n## Notes\n\n- Deal reads are **public**; no account, key, or cookie is involved. (Purchasing a\n  Groupon needs an authenticated session — that lives in the full `groupon-mcp`\n  server, not this skill.)\n- The full `groupon-mcp` MCP server wraps these same ops as typed tools\n  (`groupon_search_deals`, `groupon_get_deal`, `groupon_list_categories`) with\n  compact projections and drift-tolerant parsing — prefer it when running inside\n  an MCP host.\n\nFile v1.0.0:skill-card.md\n\n## Description:\n\nSearch and read Groupon deals from the terminal via curl using Groupon's consumer GraphQL API for deal search, deal detail, and category taxonomy.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agent users use this skill to search Groupon offers by city, inspect deal details, and retrieve category taxonomy without adding account credentials or API keys.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Groupon can receive the search terms, city slugs, and deal IDs used in lookups.\n\nMitigation: Use the skill only when sharing those lookup parameters with Groupon is acceptable.\n\nRisk: Adding cookies, account tokens, or payment data to the curl recipes could expose sensitive information.\n\nMitigation: Keep requests anonymous and do not add cookies, account tokens, or payment data.\n\n## Reference(s):\n\n- [Groupon curl recipes](references/graphql-queries.md)\n- [Groupon consumer GraphQL endpoint](https://www.groupon.com/mobilenextapi/graphql)\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/groupon-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, shell commands, markdown, configuration]\n\n**Output Format:** [Markdown with curl, jq, and JSON examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces public deal lookup guidance and command recipes; it does not install code, request credentials, or persist data.]\n\n## Skill Version(s):\n\n1.0.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: groupon-mcp Owner: chrischall Summary: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers. Tags: latest:1.1.6 Version history: v1.1.6 | 2026-10-09T23:25:52.079Z | auto - Removed the skill-card.md file. - No ch","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"POST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'"},{"language":"bash","snippet":"curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\"},{"language":"bash","snippet":"gp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}"},{"language":"bash","snippet":"# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'"},{"language":"bash","snippet":"# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'"},{"language":"bash","snippet":"grpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01\"}}}]' \\\n| jq '.[0].data'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: groupon\ndescription: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers.\n---\n\n# Groupon deals via curl\n\nGroupon's consumer deal data comes from **one GraphQL endpoint** that answers a\nplain server-side `curl` with **no cookies, no key, no login, no bot wall**:\n\n```\nPOST https://www.groupon.com/mobilenextapi/graphql\n  -H 'content-type: application/json'\n  -H 'apollographql-client-name: mobilenextapi'\n```\n\nRequests are a **batched JSON array** of Apollo **persisted-query** operations\n(`operationName` + `variables` + `extensions.persistedQuery.sha256Hash`, no query\ntext — introspection is off and the server masks GraphQL errors as opaque 400\nHTML, so you cannot hand-author queries). The response is a **JSON array**;\n`.[0].data.<field>` holds the payload. Ready-to-run bodies + `jq` recipes are in\n[`references/graphql-queries.md`](references/graphql-queries.md).\n\n## The three operations\n\n| Need | Op | Root field |\n|------|----|-----------|\n| Search / browse a city's deals | `BrowseDealFeed` | `.[0].data.browseDealFeed.cards` |\n| One deal's full detail (options, price, reviews, fine print) | `getDeal` | `.[0].data.getDeal` |\n| Category taxonomy | `GetMainNavigation` | `.[0].data...` |\n\n`division` is a Groupon **city slug** (`new-york`, `chicago`, `syracuse`, `los-angeles`, …).\n`dealId` for `getDeal` is a deal's **permalink slug** = the last path segment of a\ncard's `.url` (`https://www.groupon.com/deals/<dealId>`).\n\n## Two failure modes\n\n- **Empty / non-JSON 2xx** → almost always a challenge interstitial; retry, don't `JSON.parse` it blind.\n- **`{\"errors\":[{\"message\":\"PersistedQueryNotFound\"}]}`** → the baked `sha256Hash`\n  went stale (Groupon redeployed its frontend queries). **Re-capture it:**\n  1. Open a Groupon search page in a signed-in-or-not browser, DevTools → Network.\n  2. Filter for `mobilenextapi/graphql`, click the request whose payload `operationName`\n     matches the one you need.\n  3. Copy `extensions.persistedQuery.sha256Hash` from the request payload and replace\n     the stale hash in `references/graphql-queries.md`. (The hash is a public query\n     fingerprint, not a secret.)\n\nNote: the deal **web page** `groupon.com/deals/<slug>` returns 403 to servers, but\nthe `getDeal` GraphQL op above returns the same detail with no auth."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"groupon-mcp\",\n  \"version\": \"1.1.6\",\n  \"publishedAt\": 1791588352079\n}"},{"path":"references/graphql-queries.md","content":"# Groupon curl recipes\n\nAll hit `POST https://www.groupon.com/mobilenextapi/graphql` with headers\n`content-type: application/json` and `apollographql-client-name: mobilenextapi`.\nThe `sha256Hash` values are public persisted-query fingerprints (verified\n2026-07-24); if one returns `PersistedQueryNotFound`, re-capture it (see SKILL.md).\n\nA reusable shell function:\n\n```bash\ngp() {  # gp '<json-array-body>'  ->  raw JSON array on stdout\n  curl -s -H 'content-type: application/json' \\\n       -H 'apollographql-client-name: mobilenextapi' \\\n       -X POST --data \"$1\" \\\n       'https://www.groupon.com/mobilenextapi/graphql'\n}\n```\n\n## 1. Search / browse deals — `BrowseDealFeed`\n\nHash: `b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429`\n\n```bash\n# Search \"massage\" in New York (drop the filters[] entry for a plain city browse)\ngrpn '[{\"operationName\":\"BrowseDealFeed\",\"variables\":{\n  \"dealFeedParams\":{\"limit\":24,\"division\":\"new-york\",\"locationFromUrl\":false,\n    \"filters\":[{\"key\":\"query\",\"subKey\":null,\"value\":{\"static\":\"massage\"}}],\n    \"offset\":0,\"feedToken\":null,\"includeLocationsCount\":true},\n  \"browseParams\":{\"pathName\":\"/search\",\"isFetchMore\":false},\"allLocations\":false},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"b035b25dceb8a84a64c618345cc21a14897b7328506a39b2e27fc7ca4ec2f429\"}}}]' \\\n| jq -r '.[0].data.browseDealFeed.cards[]\n    | \"\\(.title)\\n  \\(.merchant.name // \"-\")  ★\\(.rating.value // \"-\") (\\(.rating.count // 0))  -\\(.discountPercentage // 0)%\\n  $\\((.prices.price.amount // 0)/100)  \\(.url)\\n\"'\n```\n\n- Paginate with `offset` (multiples of `limit`); total via `.[0].data.browseDealFeed.pagination`.\n- Available filters (categories, price, sort) are in `.[0].data.browseDealFeed.facets`.\n- Price is integer cents: `.prices.price.amount` (e.g. 3700 = $37.00); `.prices.strikeThroughPrice.amount` is the list price.\n\n## 2. Deal detail — `getDeal`\n\nHash: `d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236`\n\n```bash\n# dealId = last path segment of a card .url (e.g. from https://www.groupon.com/deals/pat-s-pizza-1)\ngrpn '[{\"operationName\":\"getDeal\",\"variables\":{\n  \"dealId\":\"pat-s-pizza-1\",\"optionId\":null,\"adSafe\":false,\n  \"includeGeoBreadcrumbs\":true,\"useFinePrintV3\":true},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"d60360371251da4c5ce1f753d3e55a77e80d538c6c57fd4fc20dc894cd121236\"}}}]' \\\n| jq '.[0].data.getDeal | {title, subtitle, merchant: .merchant.name, division,\n    rating: .representativeReview, options: [.options[]? | {title, id, price: .price}]}'\n```\n\n`getDeal` also carries `aiReviewSummary`, `images`, `videos`, `status`,\n`showQuantitySelector`, fine print, and per-option pricing.\n\n## 3. Category taxonomy — `GetMainNavigation`\n\nHash: `da722d6e5ae1b4e336bbda8d2d07f31925aa709acf9843c67c5a65d0827aeb01`\n\n```bash\ngrpn '[{\"operationName\":\"GetMainNavigation\",\"variables\":{\"includeChildren\":true,\"maxDepthLevel\":3},\n  \"extensions\":{\"persistedQuery\":{\"version\":1,\n    \"sha256Hash\":\"da722d6e5ae1"},{"path":"skill-card.md","content":"## Description:\n\nHelps agents search Groupon deals, inspect deal details, and browse categories using public, read-only deal data.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nPeople and agents looking for Groupon offers can search by city or keyword, inspect a deal's pricing and fine print, and browse categories without signing in.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Groupon receives the searches, city slugs, and deal IDs submitted for lookup.\n\nMitigation: Share only lookup inputs you are comfortable sending to Groupon.\n\nRisk: Refreshing an expired query fingerprint from a browser request could expose account or session data if the entire request is copied.\n\nMitigation: Copy only the public sha256Hash value, not cookies, authorization headers, or personal account data.\n\n## Reference(s):\n\n- [Groupon query recipes](references/graphql-queries.md)\n- [ClawHub skill release](https://clawhub.ai/chrischall/skills/groupon-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance]\n\n**Output Format:** [Markdown with deal details and optional shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read-only deal lookups; no purchases or account access.]\n\n## Skill Version(s):\n\n1.1.6 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers. Skill: groupon-mcp Owner: chrischall Summary: Search and read Groupon deals from the terminal via curl — the consumer GraphQL API (deal search/browse, deal detail, category taxonomy). Anonymous, no key or login. Use when asked to find Groupon deals, look up a specific deal, or browse a city's offers. Tags: latest:1.1.6 Version history: v1.1.6 | 2026-10-09T23:25:52.079Z | auto - Removed the skill-card.md file. - No ch","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1194,"uniquenessScore":50,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T03:17:56.546Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T03:17:56.546Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:44:55.466Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}