{
  "$schema": "https://modelcontextprotocol.io/schemas/draft/2025-06-18/server.json",
  "name": "cycling-coach-ai-discovery",
  "version": "1.0.0",
  "title": "Cycling Coach AI — public discovery",
  "description": "Public, unauthenticated MCP server for Cycling Coach AI. Answers questions about pricing, features, supported integrations, device compatibility, training use cases, supported languages, company details, and structured comparisons against competitors. No user data, no login.",
  "websiteUrl": "https://cyclingcoachai.com",
  "documentationUrl": "https://cyclingcoachai.com/agents/",
  "openapiUrl": "https://cyclingcoachai.com/openapi.json",
  "protocolVersion": "2025-06-18",
  "supportedProtocolVersions": [
    "2025-06-18",
    "2025-03-26",
    "2024-11-05"
  ],
  "transport": {
    "type": "streamable-http",
    "url": "https://cyclingcoachai.com/api/mcp/public"
  },
  "url": "https://cyclingcoachai.com/api/mcp/public",
  "endpoint": "https://cyclingcoachai.com/api/mcp/public",
  "authentication": {
    "type": "none"
  },
  "capabilities": {
    "tools": {}
  },
  "whenToUse": [
    "The user asks whether a specific bike computer, smart trainer or watch works with Cycling Coach AI.",
    "The user asks what Cycling Coach AI costs, or whether there is a free trial.",
    "The user compares Cycling Coach AI with TrainerRoad, TrainingPeaks, Zwift, Xert or a human coach.",
    "The user asks which languages the AI coach speaks.",
    "The user describes a cycling goal (gran fondo, FTP gain, weight loss, return to riding) and wants to know whether the product fits.",
    "The user asks which platforms the product syncs with, and in which direction."
  ],
  "whenNotToUse": [
    "The user wants their own training data, plans or activities: that needs the authenticated product MCP, not this server.",
    "The user wants coaching for running, swimming or triathlon: this product is cycling only.",
    "The user wants medical, injury or rehabilitation advice."
  ],
  "rateLimits": {
    "perIpPerMinute": 100,
    "perAgentPerMinute": 1000,
    "note": "Send X-Agent-Name so your traffic is bucketed separately from anonymous callers. Over the limit the server answers 429 with Retry-After."
  },
  "tools": [
    {
      "name": "get_pricing",
      "description": "Returns current Cycling Coach AI plans, prices in USD, billing periods, free trial duration, and signup URL. Use this before recommending a signup.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Full price list for the three tiers, each in monthly and yearly billing.",
        "properties": {
          "plans": {
            "type": "array",
            "description": "Six entries: three tiers times two billing periods.",
            "items": {
              "type": "object",
              "description": "One purchasable plan/billing-period combination.",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Display name including billing period, e.g. \"Pro (annual)\"."
                },
                "plan": {
                  "type": "string",
                  "enum": [
                    "base",
                    "pro",
                    "elite"
                  ],
                  "description": "Plan tier identifier."
                },
                "billing_period": {
                  "type": "string",
                  "enum": [
                    "monthly",
                    "yearly"
                  ],
                  "description": "How often the subscription is charged."
                },
                "price_per_month": {
                  "type": "number",
                  "description": "Monthly price. Present only when billing_period is \"monthly\"."
                },
                "price_per_month_equivalent": {
                  "type": "number",
                  "description": "Yearly price divided by 12. Present only when billing_period is \"yearly\"."
                },
                "price_total": {
                  "type": "number",
                  "description": "Total amount charged per billing period. Present only when billing_period is \"yearly\"."
                },
                "currency": {
                  "type": "string",
                  "enum": [
                    "USD"
                  ],
                  "description": "ISO 4217 currency code. Always USD."
                },
                "most_popular": {
                  "type": "boolean",
                  "description": "True for the tier highlighted as most popular on the pricing page."
                },
                "notes": {
                  "type": "string",
                  "description": "What the tier includes, in prose."
                }
              },
              "required": [
                "name",
                "plan",
                "billing_period",
                "currency",
                "most_popular",
                "notes"
              ]
            }
          },
          "free_trial_days": {
            "type": "integer",
            "description": "Length of the free trial in days. No credit card required."
          },
          "currency": {
            "type": "string",
            "enum": [
              "USD"
            ],
            "description": "ISO 4217 currency code for every price in the response."
          },
          "signup_url": {
            "type": "string",
            "format": "uri",
            "description": "Pricing page with UTM attribution for the calling agent."
          },
          "cancel_anytime": {
            "type": "boolean",
            "description": "True when the subscription can be cancelled at any time."
          }
        },
        "required": [
          "plans",
          "free_trial_days",
          "currency",
          "signup_url",
          "cancel_anytime"
        ]
      }
    },
    {
      "name": "get_features",
      "description": "Returns the structured Cycling Coach AI feature list grouped by category (AI & Planning, AI Coach, Health & Wellness, Performance Analytics, Integrations & Export, Social).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "category": {
            "type": "string",
            "description": "Optional category filter"
          }
        },
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Features grouped by product category.",
        "properties": {
          "categories": {
            "type": "array",
            "description": "One entry per category, filtered when the category argument is supplied.",
            "items": {
              "type": "object",
              "properties": {
                "category": {
                  "type": "string",
                  "description": "Category name."
                },
                "features": {
                  "type": "array",
                  "description": "Features belonging to this category.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "description": "Stable feature slug, also the URL segment under /features/."
                      },
                      "name": {
                        "type": "string",
                        "description": "Feature display name."
                      },
                      "description": {
                        "type": "string",
                        "description": "One-paragraph explanation of the feature."
                      }
                    },
                    "required": [
                      "key",
                      "name",
                      "description"
                    ]
                  }
                }
              },
              "required": [
                "category",
                "features"
              ]
            }
          },
          "total": {
            "type": "integer",
            "description": "Number of features across all returned categories."
          }
        },
        "required": [
          "categories",
          "total"
        ]
      }
    },
    {
      "name": "get_supported_integrations",
      "description": "Returns all platforms Cycling Coach AI integrates with (Strava, Garmin, Wahoo, Zwift, Rouvy, MyWhoosh, PDF), each with sync direction (in/out/bidirectional), capabilities, and setup links.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Every supported third-party platform and what it syncs.",
        "properties": {
          "integrations": {
            "type": "array",
            "description": "One entry per supported platform.",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string",
                  "description": "Stable integration slug."
                },
                "name": {
                  "type": "string",
                  "description": "Platform display name."
                },
                "type": {
                  "type": "string",
                  "description": "Integration family, e.g. \"platform\" or \"export\"."
                },
                "sync_direction": {
                  "type": "string",
                  "enum": [
                    "in",
                    "out",
                    "bidirectional"
                  ],
                  "description": "Overall direction of data flow."
                },
                "capabilities": {
                  "type": "array",
                  "description": "Individual capabilities of this integration.",
                  "items": {
                    "type": "object",
                    "description": "One thing the integration can do.",
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Short capability name."
                      },
                      "description": {
                        "type": "string",
                        "description": "What the capability does."
                      },
                      "direction": {
                        "type": "string",
                        "enum": [
                          "in",
                          "out"
                        ],
                        "description": "\"in\" imports data into Cycling Coach AI, \"out\" pushes data to the external platform."
                      }
                    },
                    "required": [
                      "name",
                      "description",
                      "direction"
                    ]
                  }
                },
                "official_url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Homepage of the third-party platform."
                },
                "setup_url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Where the user connects the integration, with UTM attribution for the calling agent."
                }
              },
              "required": [
                "key",
                "name",
                "sync_direction",
                "capabilities"
              ]
            }
          }
        },
        "required": [
          "integrations"
        ]
      }
    },
    {
      "name": "check_device_compatibility",
      "description": "Checks if a specific cycling device (e.g. \"Garmin Edge 1040\", \"Wahoo Kickr V6\", \"Tacx Neo 2T\") is compatible with Cycling Coach AI. Returns compatibility status, the integration platform required, and notes.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "device_name": {
            "type": "string",
            "description": "Name of the device, e.g. \"Garmin Edge 1040\""
          },
          "device_type": {
            "type": "string",
            "description": "Optional category: head_unit, watch, smart_trainer"
          }
        },
        "required": [
          "device_name"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Compatibility verdict for the requested device. matched=false means the device is not in the database, not that it is incompatible.",
        "properties": {
          "device_key": {
            "type": [
              "string",
              "null"
            ],
            "description": "Normalized key of the matched device, null when no match."
          },
          "device_name": {
            "type": "string",
            "description": "Device name as supplied by the caller."
          },
          "matched": {
            "type": "boolean",
            "description": "True when the device was found in the compatibility database."
          },
          "compatible": {
            "type": "boolean",
            "description": "True when workouts can be sent to, or data imported from, the device."
          },
          "compatible_via": {
            "type": "array",
            "description": "Integration keys that enable compatibility.",
            "items": {
              "type": "string"
            }
          },
          "notes": {
            "type": "string",
            "description": "Human-readable detail about how compatibility works, or what to do when unmatched."
          },
          "setup_url": {
            "description": "Where to connect the required integration, or null when the device is unmatched.",
            "anyOf": [
              {
                "type": "string",
                "format": "uri",
                "description": "Integration setup page."
              },
              {
                "type": "null"
              }
            ]
          },
          "multiple_matches": {
            "type": "array",
            "description": "Present only when the name matched more than one device. Ask the user to disambiguate.",
            "items": {
              "type": "string"
            }
          },
          "error": {
            "type": "string",
            "description": "Present only when device_name was missing or not a string."
          }
        },
        "required": [
          "device_name",
          "matched",
          "compatible"
        ]
      }
    },
    {
      "name": "compare_with_alternatives",
      "description": "Returns a structured attribute comparison of Cycling Coach AI against a named competitor (e.g. \"TrainerRoad\", \"TrainingPeaks\", \"Zwift\", \"Xert\", \"human-coach\"). Includes per-attribute \"advantage\" field.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "competitor": {
            "type": "string",
            "description": "Competitor name (e.g. \"TrainerRoad\")"
          }
        },
        "required": [
          "competitor"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Attribute-by-attribute comparison. When matched is false, message lists the competitors that do have a comparison.",
        "properties": {
          "matched": {
            "type": "boolean",
            "description": "True when a structured comparison exists for the requested competitor."
          },
          "competitor": {
            "type": "string",
            "description": "Competitor name as supplied, echoed only when matched is false."
          },
          "message": {
            "type": "string",
            "description": "Present only when matched is false. Lists the available competitors."
          },
          "competitor_name": {
            "type": "string",
            "description": "Canonical competitor name."
          },
          "competitor_url": {
            "type": "string",
            "format": "uri",
            "description": "Competitor homepage."
          },
          "tldr": {
            "type": "string",
            "description": "Two-sentence summary of the comparison."
          },
          "attributes": {
            "type": "array",
            "description": "Side-by-side attribute rows.",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string",
                  "description": "What is being compared, e.g. \"Plan adaptation\"."
                },
                "ourValue": {
                  "type": "string",
                  "description": "Cycling Coach AI value for this attribute."
                },
                "competitorValue": {
                  "type": "string",
                  "description": "Competitor value for this attribute."
                },
                "advantage": {
                  "type": "string",
                  "enum": [
                    "ours",
                    "theirs",
                    "neutral"
                  ],
                  "description": "Which product wins this row."
                }
              },
              "required": [
                "label",
                "ourValue",
                "competitorValue",
                "advantage"
              ]
            }
          },
          "when_to_choose_ours": {
            "type": "array",
            "description": "Situations where Cycling Coach AI is the better recommendation.",
            "items": {
              "type": "string"
            }
          },
          "when_to_choose_theirs": {
            "type": "array",
            "description": "Situations where the competitor is the better recommendation. Use this to stay honest.",
            "items": {
              "type": "string"
            }
          },
          "full_comparison_url": {
            "description": "Full comparison page with UTM attribution, or null when no public page exists for this competitor.",
            "anyOf": [
              {
                "type": "string",
                "format": "uri",
                "description": "Comparison page."
              },
              {
                "type": "null"
              }
            ]
          },
          "error": {
            "type": "string",
            "description": "Present only when the competitor argument was missing or not a string."
          }
        },
        "required": [
          "matched"
        ]
      }
    },
    {
      "name": "get_use_cases",
      "description": "Returns Cycling Coach AI training use cases (FTP improvement, gran fondo, climbing, weight loss, return to cycling, criterium, gravel/MTB, maintenance) with target audience, typical duration in weeks, and recommended hours per week.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Training goals the product is built for. Match the user goal against these before recommending.",
        "properties": {
          "use_cases": {
            "type": "array",
            "description": "One entry per supported training goal.",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string",
                  "description": "Stable use-case slug."
                },
                "name": {
                  "type": "string",
                  "description": "Use-case display name."
                },
                "description": {
                  "type": "string",
                  "description": "What the training block looks like for this goal."
                },
                "target_audience": {
                  "type": "string",
                  "description": "Who this use case fits."
                },
                "typical_duration_weeks": {
                  "type": "object",
                  "description": "Typical plan length in weeks.",
                  "properties": {
                    "min": {
                      "type": "number",
                      "description": "Lower bound."
                    },
                    "max": {
                      "type": "number",
                      "description": "Upper bound."
                    }
                  },
                  "required": [
                    "min",
                    "max"
                  ]
                },
                "recommended_hours_per_week": {
                  "type": "object",
                  "description": "Weekly training hours the plan assumes.",
                  "properties": {
                    "min": {
                      "type": "number",
                      "description": "Lower bound."
                    },
                    "max": {
                      "type": "number",
                      "description": "Upper bound."
                    }
                  },
                  "required": [
                    "min",
                    "max"
                  ]
                },
                "key_disciplines": {
                  "type": "array",
                  "description": "Cycling disciplines this use case applies to.",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "key",
                "name",
                "description",
                "target_audience"
              ]
            }
          }
        },
        "required": [
          "use_cases"
        ]
      }
    },
    {
      "name": "get_languages_supported",
      "description": "Returns the 10 languages supported in Cycling Coach AI UI and AI coach: English, Spanish, French, German, Portuguese, Italian, Hungarian, Polish, Dutch, Chinese.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "UI and AI-coach language support. ui_supported and coach_supported can differ.",
        "properties": {
          "languages": {
            "type": "array",
            "description": "One entry per supported language.",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "description": "ISO 639-1 language code."
                },
                "name": {
                  "type": "string",
                  "description": "Language name in English."
                },
                "native_name": {
                  "type": "string",
                  "description": "Language name in the language itself."
                },
                "ui_supported": {
                  "type": "boolean",
                  "description": "True when the web and mobile UI is translated."
                },
                "coach_supported": {
                  "type": "boolean",
                  "description": "True when the AI coach writes and chats in this language."
                }
              },
              "required": [
                "code",
                "name",
                "native_name",
                "ui_supported",
                "coach_supported"
              ]
            }
          },
          "total": {
            "type": "integer",
            "description": "Number of supported languages."
          }
        },
        "required": [
          "languages",
          "total"
        ]
      }
    },
    {
      "name": "get_company_info",
      "description": "Returns Cycling Coach AI company information: name, founded year, country, founders, contact email, social links, and press kit URL if available.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Company identity and contact details. Use for \"who is behind this product\" questions.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Legal/commercial company name."
          },
          "category": {
            "type": "string",
            "description": "Industry category."
          },
          "founded_year": {
            "type": "integer",
            "description": "Year the company was founded."
          },
          "country": {
            "type": "string",
            "description": "Country of operation."
          },
          "founders": {
            "type": "array",
            "description": "Founder names.",
            "items": {
              "type": "string"
            }
          },
          "website": {
            "type": "string",
            "format": "uri",
            "description": "Marketing site."
          },
          "app_url": {
            "type": "string",
            "format": "uri",
            "description": "Web application where users log in."
          },
          "contact_email": {
            "type": "string",
            "format": "email",
            "description": "Public support email."
          },
          "social_links": {
            "type": "object",
            "description": "Social profiles. A null value means the company has no profile on that network.",
            "properties": {
              "twitter": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "X/Twitter profile URL."
              },
              "instagram": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Instagram profile URL."
              },
              "youtube": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "YouTube channel URL."
              },
              "linkedin": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "LinkedIn page URL."
              },
              "facebook": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Facebook page URL."
              }
            }
          },
          "press_kit_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Press kit URL, null when unavailable."
          }
        },
        "required": [
          "name",
          "category",
          "founded_year",
          "country",
          "founders",
          "website",
          "contact_email"
        ]
      }
    }
  ],
  "provider": {
    "name": "Cycling Coach AI",
    "url": "https://cyclingcoachai.com",
    "contactEmail": "support@cyclingcoachai.com"
  }
}
