{"apiVersion":"v1","directorySlug":"klickspell-mcp-d45219e23e","title":"klickspell.online — Best Cafes & Restaurants Directory","description":"Discover verified digital menus, artisan coffee roasters, pure-veg spots, and top restaurants across Rishikesh.","pageUrl":"https://www.mcpbundles.com/skills/klickspell-mcp-d45219e23e","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://klickspell.online/mcp","hostedMcpUrl":null,"toolCount":13,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"online.klickspell/klickspell-mcp-d45219e23e","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"create_listing","description":"Creates a new restaurant/cafe/salon listing on klickspell.online. Always starts unclaimed (is_claimed=false) and in \"draft\" publish status, so it is not publicly visible until someone reviews it and sets status to \"live\" via update_listing. Requires an admin bearer token.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["name","area","category"],"properties":{"area":{"type":"string","maxLength":120,"minLength":1},"name":{"type":"string","maxLength":200,"minLength":1},"category":{"enum":["cafe","restaurant","salon","tattoo","spa","services","other"],"type":"string"}}},"title":"Create Listing","logicalName":"create_listing","displayName":"Create Listing","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_listing","description":"Partially updates an existing listing — only keys present in `fields` are changed, everything else is left untouched. Can update contact/address details, amenities, price range, claim status (is_claimed), and publish status (draft/live/paused). Does NOT manage menu categories/items or a photo gallery — those have no MCP tools yet; `logo_url` is the only image field in the schema. Requires an admin bearer token.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing_id","fields"],"properties":{"fields":{"type":"object","properties":{"area":{"type":"string","maxLength":120,"minLength":1},"name":{"type":"string","maxLength":200,"minLength":1},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}]},"status":{"enum":["draft","live","paused"],"type":"string"},"address":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"tagline":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"category":{"enum":["cafe","restaurant","salon","tattoo","spa","services","other"],"type":"string"},"cuisines":{"type":"array","items":{"type":"string","maxLength":40,"minLength":1},"maxItems":20},"logo_url":{"anyOf":[{"type":"string","format":"uri","maxLength":500},{"type":"null"}]},"maps_url":{"anyOf":[{"type":"string","format":"uri","maxLength":500},{"type":"null"}]},"sub_area":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"whatsapp":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}]},"amenities":{"type":"array","items":{"type":"string","maxLength":40,"minLength":1},"maxItems":30},"landmarks":{"type":"array","items":{"type":"string","maxLength":80,"minLength":1},"maxItems":20},"is_claimed":{"type":"boolean"},"brand_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"is_pure_veg":{"type":"boolean"},"postal_code":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}]},"price_range":{"anyOf":[{"enum":["₹","₹₹","₹₹₹"],"type":"string"},{"type":"null"}]},"street_address":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"additionalProperties":false},"listing_id":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","pattern":"^\\d+$"}]}}},"title":"Update Listing","logicalName":"update_listing","displayName":"Update Listing","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_listing","description":"Fetches full details for one listing by numeric id or slug, including its menu categories and items (all items, not just available ones). Read-only, no auth required for live listings; draft/paused (not yet publicly visible) listings are only returned to callers with write auth.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing"],"properties":{"listing":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","minLength":1}]}}},"title":"Get Listing","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_listing","displayName":"Get Listing"},{"name":"list_listings","description":"Lists listings as summary rows (no nested menu — use get_listing for that), optionally filtered by area (matches restaurants.area or the linked location name, case-insensitive substring) and by claim status. NOTE: \"status\" here means ownership claim (\"claimed\"/\"unclaimed\"), not publish status (draft/live/paused) — each returned row still includes its publish `status` field for reference. Read-only, no auth required; only live listings are returned unless the caller has write auth, in which case","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"area":{"type":"string","maxLength":120,"minLength":1},"limit":{"type":"integer","maximum":200,"minimum":1},"status":{"enum":["claimed","unclaimed"],"type":"string"}}},"title":"List Listings","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_listings","displayName":"List Listings"},{"name":"search_console_summary","description":"NOT YET IMPLEMENTED. Would return Google Search Console impressions/clicks/query summary for klickspell.online, but no Search Console API credentials or client exist in this codebase today (only Google Places and Google Reviews integrations are wired up). Always returns a clearly-labeled stub rather than fabricated numbers. Read-only — no auth required.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"date_range":{"type":"object","properties":{"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}}}},"title":"Search Console Summary","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"search_console_summary","displayName":"Search Console Summary"},{"name":"get_scan_analytics","description":"QR/menu-page scan counts for one listing: daily totals, breakdown by table label, and hourly distribution. Backed by the same scans table and queries as the existing admin analytics dashboard. Defaults to the last 30 days when date_range is omitted. Very recent scans (within ~5s) may be missing — scans are buffered in memory briefly before being written to the database. Read-only, but requires write auth since this is the same competitively-sensitive data the web admin dashboard gates behind a l","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing_id"],"properties":{"date_range":{"type":"object","properties":{"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}},"listing_id":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","pattern":"^\\d+$"}]}}},"title":"Get Scan Analytics","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_scan_analytics","displayName":"Get Scan Analytics"},{"name":"sync_listing_from_google","description":"Enriches one listing from Google: matches it to a Google Place (by name+area+city, or by an exact google_place_id override), then writes address/phone/maps_url/latitude/longitude and refreshes google_rating/google_reviews_count/google_reviews (via the existing reviews sync). Chains the Google Places integration (src/lib/googlePlaces.ts) into the Google Reviews integration (src/lib/googleReviews.ts). If the listing already has a stored google_place_id and no override is given, that stored id is r","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing_id"],"properties":{"listing_id":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","pattern":"^\\d+$"}]},"google_place_id":{"type":"string","maxLength":300,"minLength":10}}},"title":"Sync Listing From Google","logicalName":"sync_listing_from_google","displayName":"Sync Listing From Google","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sync_listings_from_google","description":"Batch version of sync_listing_from_google — runs the same match-then-enrich flow for up to 20 listings sequentially in one call (useful right after creating several listings at once). Each listing gets its own independent result in `results`, including its own matched/reason/error — one bad or ambiguous match never aborts the rest of the batch. Requires an admin bearer token.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing_ids"],"properties":{"listing_ids":{"type":"array","items":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","pattern":"^\\d+$"}]},"maxItems":20,"minItems":1},"google_place_ids":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}}},"title":"Sync Listings From Google (Batch)","logicalName":"sync_listings_from_google","displayName":"Sync Listings From Google (Batch)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_menu","description":"Saves an entire menu (categories + items) for one listing in a single atomic call — the only way to write menu data through this MCP server (update_listing explicitly does not touch menus). Two modes: \"merge\" (the default) matches categories by name and items by name (case-insensitive, trimmed) within their category, updates matched items' price/description/is_veg/is_available, creates anything missing, and leaves unmentioned categories/items completely untouched. \"replace\" makes the listing's m","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing_id","categories"],"properties":{"mode":{"enum":["replace","merge"],"type":"string"},"dry_run":{"type":"boolean"},"categories":{"type":"array","items":{"type":"object","required":["name","items"],"properties":{"name":{"type":"string","maxLength":100,"minLength":1},"items":{"type":"array","items":{"type":"object","required":["name","price"],"properties":{"name":{"type":"string","maxLength":200,"minLength":1},"price":{"type":"number"},"is_veg":{"type":["boolean","null"]},"is_available":{"type":"boolean"}}}}}}},"listing_id":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","pattern":"^\\d+$"}]}}},"title":"Set Menu","logicalName":"set_menu","displayName":"Set Menu","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_menu_item","description":"Partially updates one existing menu item — looked up by its category name and item name (case-insensitive, trimmed) — without resending the whole menu. Use this for price changes or marking an item unavailable. Only keys present in `fields` are changed; everything else on the item is left exactly as it was. Requires an admin bearer token.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing_id","category","item","fields"],"properties":{"item":{"type":"string","maxLength":200,"minLength":1},"fields":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"minLength":1},"price":{"type":"number"},"is_veg":{"type":["boolean","null"]},"is_available":{"type":"boolean"}}},"category":{"type":"string","maxLength":100,"minLength":1},"listing_id":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","pattern":"^\\d+$"}]}}},"title":"Update Menu Item","logicalName":"update_menu_item","displayName":"Update Menu Item","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_menu_item","description":"Permanently deletes one menu item, looked up by its category name and item name (case-insensitive, trimmed). Requires an admin bearer token.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing_id","category","item"],"properties":{"item":{"type":"string","maxLength":200,"minLength":1},"category":{"type":"string","maxLength":100,"minLength":1},"listing_id":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","pattern":"^\\d+$"}]}}},"title":"Delete Menu Item","logicalName":"delete_menu_item","displayName":"Delete Menu Item","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_menu_category","description":"Permanently deletes a menu category, looked up by name (case-insensitive, trimmed). Refuses to delete a non-empty category unless delete_items is true, in which case its items are deleted too. Requires an admin bearer token.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing_id","category"],"properties":{"category":{"type":"string","maxLength":100,"minLength":1},"listing_id":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","pattern":"^\\d+$"}]},"delete_items":{"type":"boolean"}}},"title":"Delete Menu Category","logicalName":"delete_menu_category","displayName":"Delete Menu Category","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"reorder_categories","description":"Sets the display order of a listing's menu categories. `order` must name every existing category exactly once (case-insensitive, trimmed) — partial lists are rejected. Requires an admin bearer token.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["listing_id","order"],"properties":{"order":{"type":"array","items":{"type":"string","minLength":1},"minItems":1},"listing_id":{"anyOf":[{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},{"type":"string","pattern":"^\\d+$"}]}}},"title":"Reorder Categories","logicalName":"reorder_categories","displayName":"Reorder Categories","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=klickspell-online-Best-Cafes-Restaurants-Directory&config=eyJ1cmwiOiAiaHR0cHM6Ly9rbGlja3NwZWxsLm9ubGluZS9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22klickspell-online-Best-Cafes-Restaurants-Directory%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fklickspell.online%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22klickspell-online-Best-Cafes-Restaurants-Directory%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fklickspell.online%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=klickspell.online+%E2%80%94+Best+Cafes+%26+Restaurants+Directory&connectorUrl=https%3A%2F%2Fklickspell.online%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"klickspell-online-Best-Cafes-Restaurants-Directory\" --url \"https://klickspell.online/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/klickspell-mcp-d45219e23e","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/klickspell-mcp-d45219e23e/tools/{tool}","mcpServerUrl":"https://klickspell.online/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/klickspell-mcp-d45219e23e?live=1"}