{
  "markdown": "# DuckHub MCP Server — restaurant menu management for AI agents\n\n> **Hosted MCP (Model Context Protocol) server for [DuckHub](https://duck-hub.com).**\n> Manage a restaurant's menu — products, categories, modifiers, prices, images,\n> translations, promotions, orders — straight from Claude, Cursor, or any\n> MCP-capable AI agent. One URL, your `dk_live_` API key, **39 ready-made tools**.\n> No install, no code — the server is hosted by DuckHub.\n\n<!-- SEO/AEO keywords: DuckHub MCP server, restaurant menu MCP, AI menu management,\n     hosted MCP server, remote MCP server, Model Context Protocol restaurant,\n     menu API MCP, Claude restaurant menu, Cursor MCP menu, AI restaurant SaaS -->\n\n[![MCP](https://img.shields.io/badge/MCP-Model_Context_Protocol-000)](https://modelcontextprotocol.io/)\n[![Transport](https://img.shields.io/badge/transport-Streamable_HTTP-blue)](https://modelcontextprotocol.io/)\n[![Hosted](https://img.shields.io/badge/hosting-remote_%2F_hosted-brightgreen)]()\n[![Auth](https://img.shields.io/badge/auth-API_key_(dk__live__)-orange)](https://docs.duck-hub.com/docs/authentication)\n[![Docs](https://img.shields.io/badge/docs-docs.duck--hub.com%2Fmcp-purple)](https://docs.duck-hub.com/mcp)\n[![Glama quality](https://glama.ai/mcp/servers/tykhokhod-dmytro/duckhub-mcp-server/badges/score.svg)](https://glama.ai/mcp/servers/tykhokhod-dmytro/duckhub-mcp-server)\n\n---\n\n## What is this?\n\n**DuckHub** is a SaaS platform for restaurants: digital menus, contactless\nordering, table reservations and delivery. The **DuckHub MCP server** exposes\nthe DuckHub [v1 REST API](https://docs.duck-hub.com/docs) to AI agents as typed\n**tools**. Instead of writing HTTP requests, your agent sees `build_menu`,\n`set_image`, `publish_menu` and can build and manage a full menu from a\nconversation.\n\nThe server is **remote / hosted** — there is nothing to install or run. You add\none URL to your AI client and authenticate with the same `dk_live_` API key the\nREST API uses.\n\n## Endpoint\n\n```\nPOST https://mcp.duck-hub.com/mcp\n```\n\nIf the `mcp.` subdomain is not yet resolvable in your network, the same server is\nalso reachable at `https://api.duck-hub.com/mcp`.\n\n- **Transport:** Streamable HTTP (stateless)\n- **Auth:** `Authorization: Bearer dk_live_...` header (API key from the DuckHub\n  app → **Integrations** page)\n- All the usual [rate limits](https://docs.duck-hub.com/docs/rate-limits),\n  [plan limits](https://docs.duck-hub.com/docs/plan-limits) and the\n  [audit log](https://docs.duck-hub.com/docs/audit-log) apply unchanged.\n\n## Connect your client\n\nGet your API key from the DuckHub app → **Integrations**, then:\n\n### Claude Code\n```bash\nclaude mcp add --transport http duckhub https://mcp.duck-hub.com/mcp \\\n  --header \"Authorization: Bearer dk_live_your_api_key\"\n```\n\n### Cursor — `.cursor/mcp.json`\n```json\n{\n  \"mcpServers\": {\n    \"duckhub\": {\n      \"url\": \"https://mcp.duck-hub.com/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${env:DUCKHUB_API_KEY}\" }\n    }\n  }\n}\n```\n\n### Claude Desktop — `claude_desktop_config.json`\nDesktop connects remote servers through the `mcp-remote` bridge (needs Node.js):\n```json\n{\n  \"mcpServers\": {\n    \"duckhub\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https://mcp.duck-hub.com/mcp\",\n        \"--header\",\n        \"Authorization: Bearer dk_live_your_api_key\"\n      ]\n    }\n  }\n}\n```\n\n### Claude API — MCP connector block\n```json\n{\n  \"mcp_servers\": [\n    {\n      \"type\": \"url\",\n      \"url\": \"https://mcp.duck-hub.com/mcp\",\n      \"name\": \"duckhub\",\n      \"authorization_token\": \"dk_live_your_api_key\"\n    }\n  ]\n}\n```\n\n### claude.ai (web) & ChatGPT — OAuth\n\nclaude.ai and ChatGPT connect custom MCP servers through **OAuth** (there is no\nAPI-key field). Add DuckHub as a custom connector with the URL:\n\n```\nhttps://mcp.duck-hub.com/mcp\n```\n\nthen **Sign in to DuckHub**, choose the venue to connect, and approve. The flow\nuses OAuth 2.1 with PKCE — your DuckHub login authorizes access and no API key is\nstored in the client. One DuckHub account maps to one connected venue at a time\n(reconnect from the DuckHub app to switch venues).\n\n## Read-only access\n\nThe Integrations page can also issue a **read-only key** (same `dk_live_`\nformat). With it every read tool works normally, and every write tool fails with\n`403 READ_ONLY_KEY` — the API refuses the write before touching anything. Write\ntools are also marked with standard MCP annotations (`readOnlyHint` /\n`destructiveHint`), so well-behaved clients can filter or confirm them. Use a\nread-only key for agents that should analyse the menu but never change it.\n\n## The 39 tools\n\nAll tools wrap the [v1 REST API](https://docs.duck-hub.com/docs) — same behavior,\nsame limits.\n\n| Group | Tools |\n| --- | --- |\n| **Discover & read** | `get_reference`, `get_menu`, `list_products`, `get_product`, `list_categories`, `list_publications`, `get_audit_log` |\n| **Build the menu** | `build_menu` (bulk sync), `set_product`, `delete_product`, `set_modifier_group`, `delete_modifier_group`, `list_modifier_groups` |\n| **Settings** | `get_settings` + 7 task-scoped `update_*` tools |\n| **Media** | `set_image` — product / banner / logo |\n| **Translations** | `set_translations`, `get_translations` |\n| **Merchandising** | promotions / banners / tables — `list_* / set_* / delete_*` |\n| **Go live** | `publish_menu`, `rollback_publish`, `cleanup_menu` |\n| **Orders** (paid plans) | `list_orders`, `get_order`, `update_order_status` |\n\nAgents should call **`get_reference` first**: it returns every allowed enum\nvalue, the venue's plan limits and current usage, and the money conventions.\n\n### Things agents get wrong\n- **Money is integers in minor units** — `12.50` is sent as `1250` (cents).\n- **Nothing is guest-visible until you publish.** `build_menu` edits the draft;\n  `publish_menu` makes it live (with a rollback snapshot).\n- **Dry-run first.** `build_menu` and `cleanup_menu` accept `dryRun: true`.\n- **`cleanup_menu` arrays are KEEP-lists** — anything not listed is hidden/deleted.\n- **Orders tools need a paid plan** — else `403 PAID_PLAN_REQUIRED`.\n\n## Full documentation\n\n**→ [docs.duck-hub.com/mcp](https://docs.duck-hub.com/mcp)** — connection guide,\nper-tool reference, error envelope, rate/plan limits.\n\n## About / support\n\n- Product: **[duck-hub.com](https://duck-hub.com)**\n- API docs: **[docs.duck-hub.com](https://docs.duck-hub.com)**\n- Issues / questions: open an issue in this repository.\n\n## License\n\nMIT — see [LICENSE](./LICENSE). This repository contains documentation and the\nserver manifest only; the MCP server itself is hosted by DuckHub.\n",
  "bytes": 6594,
  "sha": "19deccdb3e66428bba4d7703d88b1958204a61833cd337c5d19a3ccc33b0bfe6",
  "repo_slug": "tykhokhod-dmytro/duckhub-mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_duck_hub_menu_a185cb15/readme"
}