{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"MCP server","description":"REST API for the YOGO fitness platform — bookings, classes, customers, orders, teachers.","llmstxt":{"title":"YOGO API documentation","description":"REST API for the YOGO fitness platform. Customers can list classes, customers, teachers, orders, bookings, and the audit log; assign teachers to classes; and use the same data via an MCP server at mcp.yogobooking.com.","hide":false,"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"mcp-server","__idx":0},"children":["MCP server"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The YOGO MCP server lets AI assistants — Claude, ChatGPT, Gemini, and any other"," ","client that speaks the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://modelcontextprotocol.io"},"children":["Model Context Protocol"]}," ","— call YOGO data directly. Every endpoint of this REST API is also exposed as an"," ","MCP \"tool\" so the AI can list customers, look up classes, find orders, and"," ","reassign teachers without you writing any glue code."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["It's a thin proxy in front of the same REST API documented here. Same data,"," ","same authentication (your existing YOGO API key), same plan-gating, same"," ","audit log. The difference is the surface: instead of writing HTTP calls, you"," ","plug your AI client into the MCP endpoint and ask questions in natural"," ","language."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The MCP server is available at:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"https://mcp.yogobooking.com/mcp\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"endpoint-and-authentication","__idx":1},"children":["Endpoint and authentication"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Connect using the MCP ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Streamable HTTP"]}," transport (single endpoint;"," ","the client does ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /mcp"]}," for tool calls and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /mcp"]}," for server-sent"," ","events). Authenticate with the same key you use for REST, sent as a bearer"," ","token:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"http","header":{"controls":{"copy":{}}},"source":"POST /mcp HTTP/1.1\nHost: mcp.yogobooking.com\nAuthorization: Bearer your_api_key_here\nContent-Type: application/json\n","lang":"http"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The MCP server forwards your bearer token to the REST API as the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["X-API-KEY"]}," ","header on every upstream call, so plan-gating, rate limits, and audit logging"," ","behave identically. There is no separate identity model."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"compatibility","__idx":2},"children":["Compatibility"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Client"},"children":["Client"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Status"},"children":["Status"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Claude Code (CLI)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Supported (native HTTP MCP)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Claude Desktop"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Supported via the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mcp-remote"]}," stdio bridge."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Gemini CLI / Gemini Code Assist"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Supported (native HTTP MCP)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Any client supporting Streamable HTTP MCP with a custom ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Authorization"]}," header"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Supported."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["ChatGPT (custom connectors)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Not supported yet."]}," ChatGPT's custom-connector flow requires OAuth 2.0/2.1; it doesn't accept static API keys or pre-shared bearer tokens. See the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#connecting-from-chatgpt"},"children":["ChatGPT section"]}," below for workarounds."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Claude.ai web (custom connectors)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Not supported yet."]}," Same OAuth-2.1 requirement as ChatGPT. Use Claude Desktop or Claude Code instead."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"available-tools","__idx":3},"children":["Available tools"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The server exposes 29 tools. Each maps to a single REST endpoint:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Tool name"},"children":["Tool name"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"REST equivalent"},"children":["REST equivalent"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_customers"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /customers"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_customer"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /customers/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_teachers"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /teachers"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_teacher"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /teachers/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_orders"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /orders"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_order"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /orders/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_bookings"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /bookings"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_booking"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /bookings/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_classes"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /classes"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_class"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /classes/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["set_class_teachers"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /classes/{id}/teachers"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_memberships"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /memberships"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_membership"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /memberships/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_membership_types"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /membership-types"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_membership_type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /membership-types/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_class_passes"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /class-passes"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_class_pass"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /class-passes/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_class_pass_types"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /class-pass-types"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_class_pass_type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /class-pass-types/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_events"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /events"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_event"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /events/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_event_registrations"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /event-registrations"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_event_registration"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /event-registrations/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_class_series"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /class-series"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_class_series"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /class-series/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_class_series_types"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /class-series-types"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_class_series_type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /class-series-types/{id}"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_write_logs"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /write-logs"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_write_log"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /write-logs/{id}"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The canonical, always-up-to-date input schemas live on the server itself."," ","After connecting, your client can call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tools/list"]}," to retrieve the full"," ","descriptions and argument types."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["set_class_teachers"]}," is the only write tool. It replaces the entire teacher"," ","list on a class (pass ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["teacherIds: []"]}," to clear). Every successful call is"," ","recorded in the audit log and surfaces via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_write_logs"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"connecting-from-claude-desktop","__idx":4},"children":["Connecting from Claude Desktop"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Anthropic's hosted Custom Connectors (the \"Connectors\" panel inside"," ","claude.ai) require OAuth 2.1, which YOGO MCP doesn't implement. The reliable"," ","path for Claude Desktop is therefore the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mcp-remote"]}," stdio bridge — a tiny"," ","local proxy that speaks stdio MCP to Claude Desktop and Streamable HTTP to"," ","our server, attaching your bearer token along the way."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Edit ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["claude_desktop_config.json"]},":"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"OS"},"children":["OS"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Path"},"children":["Path"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["macOS"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["~/Library/Application Support/Claude/claude_desktop_config.json"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Windows"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["%APPDATA%\\Claude\\claude_desktop_config.json"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Linux"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["~/.config/Claude/claude_desktop_config.json"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"mcpServers\": {\n    \"yogo\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"mcp-remote\",\n        \"https://mcp.yogobooking.com/mcp\",\n        \"--header\",\n        \"Authorization: Bearer your_api_key_here\"\n      ]\n    }\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Restart Claude Desktop. The plug/tools indicator in the input bar should"," ","list ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["yogo"]}," with 13 tools attached. Node.js must be installed locally for"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["npx"]}," to work."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"connecting-from-claude-code","__idx":5},"children":["Connecting from Claude Code"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The fastest path is the CLI. All flags come before the server name:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"claude mcp add \\\n  --transport http \\\n  --scope user \\\n  --header \"Authorization: Bearer your_api_key_here\" \\\n  yogo https://mcp.yogobooking.com/mcp\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Or edit ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["~/.claude.json"]}," (user scope) or a project-local ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".mcp.json"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"mcpServers\": {\n    \"yogo\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.yogobooking.com/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer your_api_key_here\"\n      }\n    }\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Run ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/mcp"]}," in Claude Code to confirm the connection and inspect the tools."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"connecting-from-chatgpt","__idx":6},"children":["Connecting from ChatGPT"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["ChatGPT can connect to remote MCP servers, but its custom-connector flow"," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["only accepts OAuth 2.0 / 2.1 authorization-code authentication"]},". It does"," ","not accept static API keys or pre-shared bearer tokens. Since YOGO MCP"," ","authenticates with your existing API key (a static bearer), ChatGPT can't"," ","connect directly today."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Native ChatGPT support is on our roadmap; we'll update this page when YOGO"," ","MCP exposes an OAuth flow."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"connecting-from-gemini","__idx":7},"children":["Connecting from Gemini"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The fastest path is the Gemini CLI subcommand:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"gemini mcp add \\\n  --transport http \\\n  --header \"Authorization: Bearer your_api_key_here\" \\\n  yogo https://mcp.yogobooking.com/mcp\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Or edit ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["~/.gemini/settings.json"]}," (or a workspace-local ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".gemini/settings.json"]},"):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"mcpServers\": {\n    \"yogo\": {\n      \"httpUrl\": \"https://mcp.yogobooking.com/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer your_api_key_here\"\n      }\n    }\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note: the field name is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["httpUrl"]}," (not ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["url"]},") — that's how the Gemini CLI"," ","distinguishes Streamable HTTP from stdio MCP servers. Restart the CLI / IDE"," ","extension. The same JSON works in Gemini Code Assist (the IDE extension)"," ","when placed in the workspace settings file."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"example-prompts","__idx":8},"children":["Example prompts"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once connected, you can ask your AI assistant questions like these. The AI"," ","picks the right tool automatically based on the prompt:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"Show me the YOGO classes scheduled for next week with their teachers.\""]}," ","→ ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_classes"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["expand=teachers"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"How many customers signed up in the last 30 days?\""]}," ","→ ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_customers"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["auto_paginate: true"]},", then count."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"Find all orders over 1,000 DKK in April and group them by customer.\""]}," ","→ ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_orders"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["expand=customer"]},", then aggregate."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"Which teacher taught the most classes last month?\""]}," ","→ ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_classes"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["expand=teachers"]}," over the date range."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"Replace the teachers on class 12345 with teacher 678.\""]}," ","→ ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["set_class_teachers"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id: 12345, teacherIds: [678]"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"List any teacher reassignments made via the API today.\""]}," ","→ ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["list_write_logs"]}," filtered to today and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["entityType: class.teachers"]},". The"," ","audit log only records writes made through the public API (including writes"," ","made via this MCP server). Changes made in the YOGO admin UI don't appear"," ","here."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"pagination","__idx":9},"children":["Pagination"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["List tool results carry a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["_pagination"]}," object alongside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": [ /* page of records */ ],\n  \"_pagination\": {\n    \"hasMore\": true,\n    \"nextCursor\": 456,\n    \"pagesFetched\": 1\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["_pagination.hasMore"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]},", pass ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["_pagination.nextCursor"]}," as the"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after"]}," argument on the next call to fetch the next page. Or set"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["auto_paginate: true"]}," and the server will walk pages for you (capped at five"," ","pages by default to keep responses bounded)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The cursor format is the same as on REST — see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/pagination"},"children":["pagination guide"]},"."," ","The shape differs only because MCP tool results are structured JSON the"," ","client deserializes; there's no ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["next"]}," URL to follow."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"rate-limiting","__idx":10},"children":["Rate limiting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The MCP server applies the same per-client rate limit as the REST API: 100"," ","requests per minute. A 429 from upstream surfaces as a tool error containing"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["_meta.retry_after_seconds"]},", which the AI client can use to back off cleanly."," ","See the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/rate-limiting"},"children":["rate-limiting guide"]}," for the underlying behaviour."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"errors","__idx":11},"children":["Errors"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Errors fall into two buckets:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Tool errors"]}," (the call ran, the upstream said no): ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["4xx"]}," responses from"," ","the REST API are returned as MCP tool-error results, so the AI sees the"," ","message and can react — for example, retrying with a different ID on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]},","," ","or telling you to upgrade the plan on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403 PLAN_UPGRADE_REQUIRED"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Protocol errors"]}," (the call couldn't run): ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["5xx"]}," upstream errors and"," ","network failures bubble up as JSON-RPC errors. Read GETs are retried once"," ","before failing."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The full status-code semantics are the same as REST — see the"," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/errors"},"children":["errors guide"]},"."]}]},"headings":[{"value":"MCP server","id":"mcp-server","depth":1},{"value":"Endpoint and authentication","id":"endpoint-and-authentication","depth":2},{"value":"Compatibility","id":"compatibility","depth":2},{"value":"Available tools","id":"available-tools","depth":2},{"value":"Connecting from Claude Desktop","id":"connecting-from-claude-desktop","depth":2},{"value":"Connecting from Claude Code","id":"connecting-from-claude-code","depth":2},{"value":"Connecting from ChatGPT","id":"connecting-from-chatgpt","depth":2},{"value":"Connecting from Gemini","id":"connecting-from-gemini","depth":2},{"value":"Example prompts","id":"example-prompts","depth":2},{"value":"Pagination","id":"pagination","depth":2},{"value":"Rate limiting","id":"rate-limiting","depth":2},{"value":"Errors","id":"errors","depth":2}],"frontmatter":{"title":"MCP server","seo":{"title":"MCP server"}},"lastModified":"2026-08-03T09:56:03.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/mcp-server","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}