{"openapi":"3.1.0","info":{"title":"Contendeo.ai MCP Server","version":"0.1.0"},"paths":{"/auth/authorize":{"get":{"tags":["auth"],"summary":"Authorize","description":"Begin the OAuth 2.0 authorization code flow.\n\nClaude calls this with its callback URL. We redirect the user to Supabase\nAuth for login; Supabase redirects back to /auth/callback where we mint an\nauthorization code and redirect to the caller's redirect_uri.","operationId":"authorize_auth_authorize_get","parameters":[{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","title":"Redirect Uri"}},{"name":"response_type","in":"query","required":false,"schema":{"type":"string","default":"code","title":"Response Type"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/callback":{"get":{"tags":["auth"],"summary":"Callback","description":"Handle Supabase's redirect back to us after user logs in.\n\nSupabase returns the access/refresh tokens in the URL fragment, so this\nroute serves an HTML page that extracts them via JS and posts them to\n/auth/finalize, which then redirects back to Claude with our code.","operationId":"callback_auth_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/dashboard_login":{"get":{"tags":["auth"],"summary":"Dashboard Login","description":"Start a browser-session OAuth login for the dashboard (not Claude).\n\nSafe `next` paths only (must start with \"/dashboard\"). On success the\ncallback handler sets a contendeo_session cookie and redirects to `next`.","operationId":"dashboard_login_auth_dashboard_login_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"/dashboard","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/finalize":{"post":{"tags":["auth"],"summary":"Finalize","operationId":"finalize_auth_finalize_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_finalize_auth_finalize_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/token":{"post":{"tags":["auth"],"summary":"Token","operationId":"token_auth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_auth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh","operationId":"refresh_auth_refresh_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_refresh_auth_refresh_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["oauth-metadata"],"summary":"Authorization Server Metadata","description":"RFC 8414 — Authorization Server Metadata.","operationId":"authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Authorization Server Metadata  Well Known Oauth Authorization Server Get"}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"tags":["oauth-metadata"],"summary":"Protected Resource Metadata","description":"RFC 9728 — Protected Resource Metadata for the MCP endpoint.","operationId":"protected_resource_metadata__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Protected Resource Metadata  Well Known Oauth Protected Resource Get"}}}}}}},"/register":{"post":{"tags":["oauth-metadata"],"summary":"Register Client","description":"RFC 7591 — Dynamic Client Registration.","operationId":"register_client_register_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Register Client Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/razorpay":{"post":{"tags":["webhooks"],"summary":"Razorpay Webhook","operationId":"razorpay_webhook_webhooks_razorpay_post","parameters":[{"name":"X-Razorpay-Signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Razorpay-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me":{"get":{"tags":["dashboard"],"summary":"Api Me","operationId":"api_me_api_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/usage":{"get":{"tags":["dashboard"],"summary":"Api Usage","operationId":"api_usage_api_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/checkout/subscription":{"post":{"tags":["dashboard"],"summary":"Api Checkout Subscription","operationId":"api_checkout_subscription_api_checkout_subscription_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/checkout/payg":{"post":{"tags":["dashboard"],"summary":"Api Checkout Payg","operationId":"api_checkout_payg_api_checkout_payg_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logout":{"post":{"tags":["dashboard"],"summary":"Api Logout","operationId":"api_logout_api_logout_post","parameters":[{"name":"contendeo_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contendeo Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redeem":{"post":{"tags":["dashboard"],"summary":"Api Redeem","operationId":"api_redeem_api_redeem_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/attribution":{"post":{"tags":["dashboard"],"summary":"Api Attribution","operationId":"api_attribution_api_attribution_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/":{"get":{"summary":"Landing","operationId":"landing__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Landing","operationId":"landing__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/privacy":{"get":{"summary":"Privacy","operationId":"privacy_privacy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/terms":{"get":{"summary":"Terms","operationId":"terms_terms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/demo":{"get":{"summary":"Demo","operationId":"demo_demo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/upload":{"get":{"summary":"Upload","operationId":"upload_upload_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Upload","operationId":"upload_upload_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/mcp/server-card.json":{"get":{"summary":"Mcp Server Card","operationId":"mcp_server_card__well_known_mcp_server_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard":{"get":{"summary":"Dashboard","operationId":"dashboard_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/favicon.ico":{"get":{"summary":"Favicon","operationId":"favicon_favicon_ico_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Favicon","operationId":"favicon_favicon_ico_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/favicon-16x16.png":{"get":{"summary":"Favicon 16","operationId":"favicon_16_favicon_16x16_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Favicon 16","operationId":"favicon_16_favicon_16x16_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/favicon-32x32.png":{"get":{"summary":"Favicon 32","operationId":"favicon_32_favicon_32x32_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Favicon 32","operationId":"favicon_32_favicon_32x32_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/apple-touch-icon.png":{"get":{"summary":"Apple Touch Icon","operationId":"apple_touch_icon_apple_touch_icon_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Apple Touch Icon","operationId":"apple_touch_icon_apple_touch_icon_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/android-chrome-192x192.png":{"get":{"summary":"Android Chrome 192","operationId":"android_chrome_192_android_chrome_192x192_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Android Chrome 192","operationId":"android_chrome_192_android_chrome_192x192_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/android-chrome-512x512.png":{"get":{"summary":"Android Chrome 512","operationId":"android_chrome_512_android_chrome_512x512_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Android Chrome 512","operationId":"android_chrome_512_android_chrome_512x512_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/site.webmanifest":{"get":{"summary":"Site Webmanifest","operationId":"site_webmanifest_site_webmanifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Site Webmanifest","operationId":"site_webmanifest_site_webmanifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/contendeo-main.mp4":{"get":{"summary":"Contendeo Main Video","operationId":"contendeo_main_video_contendeo_main_mp4_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Contendeo Main Video","operationId":"contendeo_main_video_contendeo_main_mp4_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/contendeo-poster.jpg":{"get":{"summary":"Contendeo Poster","operationId":"contendeo_poster_contendeo_poster_jpg_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Contendeo Poster","operationId":"contendeo_poster_contendeo_poster_jpg_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/styles.css":{"get":{"summary":"Styles Css","operationId":"styles_css_styles_css_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Styles Css","operationId":"styles_css_styles_css_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/fonts/inter-var.woff2":{"get":{"summary":"Font Inter","operationId":"font_inter_fonts_inter_var_woff2_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Font Inter","operationId":"font_inter_fonts_inter_var_woff2_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/fonts/jetbrains-mono-var.woff2":{"get":{"summary":"Font Jetbrains Mono","operationId":"font_jetbrains_mono_fonts_jetbrains_mono_var_woff2_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Font Jetbrains Mono","operationId":"font_jetbrains_mono_fonts_jetbrains_mono_var_woff2_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/og-card.png":{"get":{"summary":"Og Card","operationId":"og_card_og_card_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Og Card","operationId":"og_card_og_card_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/robots.txt":{"get":{"summary":"Robots Txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Robots Txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_finalize_auth_finalize_post":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token","default":""},"expires_in":{"type":"integer","title":"Expires In","default":3600},"client_redirect_uri":{"type":"string","title":"Client Redirect Uri"},"client_state":{"type":"string","title":"Client State","default":""}},"type":"object","required":["access_token","client_redirect_uri"],"title":"Body_finalize_auth_finalize_post"},"Body_refresh_auth_refresh_post":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"Body_refresh_auth_refresh_post"},"Body_token_auth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"code":{"type":"string","title":"Code","default":""},"redirect_uri":{"type":"string","title":"Redirect Uri","default":""},"refresh_token":{"type":"string","title":"Refresh Token","default":""},"client_id":{"type":"string","title":"Client Id","default":""},"client_secret":{"type":"string","title":"Client Secret","default":""},"code_verifier":{"type":"string","title":"Code Verifier","default":""}},"type":"object","required":["grant_type"],"title":"Body_token_auth_token_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}