{
  "openapi": "3.1.0",
  "info": {
    "title": "OlaChill public catalogue API",
    "version": "1.0.0",
    "summary": "Read-only access to OlaChill's Japan travel catalogue.",
    "description": "Public, read-only endpoints for AI agents and developers. No authentication. Prices are 'from' prices in JPY; dates, availability, final price, cancellation terms and payment are always on the product page, where the traveller books. There are no booking or payment endpoints.",
    "contact": {
      "name": "OlaChill (MIA Co., Ltd.)",
      "email": "partners@olachill.com",
      "url": "https://olachill.com/developers"
    },
    "termsOfService": "https://olachill.com/en/terms-of-service"
  },
  "externalDocs": {
    "description": "Developer documentation",
    "url": "https://olachill.com/developers"
  },
  "servers": [
    {
      "url": "https://olachill.com"
    }
  ],
  "paths": {
    "/agent-catalog/{locale}.json": {
      "get": {
        "operationId": "getCatalog",
        "summary": "Get the full catalogue in one language",
        "description": "Service areas with URLs and contacts, plus every searchable product (name, type, 'from' price, page path). Refreshed hourly.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "Language of names and URLs.",
            "schema": {
              "type": "string",
              "enum": [
                "en",
                "ja",
                "zh",
                "tw",
                "ko",
                "th",
                "id",
                "fr",
                "de",
                "es",
                "it",
                "vi"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Catalogue",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalog"
                }
              }
            }
          },
          "404": {
            "description": "Unknown language"
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "operationId": "mcpJsonRpc",
        "summary": "MCP server (Streamable HTTP, stateless JSON-RPC 2.0)",
        "description": "Model Context Protocol endpoint. Methods: initialize, ping, tools/list, tools/call. Tools (see tools/list for schemas): recommend_japan_travel_options, search_travel_products, check_product_availability, search_helicopter_experiences, search_private_transfers, search_charter_vehicles, get_charter_quote, request_charter_quote (sends a quotation request after the user confirms), get_booking_status and list_olachill_services. All tools except request_charter_quote are read-only.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JsonRpcRequest"
              },
              "example": {
                "jsonrpc": "2.0",
                "id": 1,
                "method": "tools/call",
                "params": {
                  "name": "search_travel_products",
                  "arguments": {
                    "query": "mt fuji",
                    "limit": 5,
                    "locale": "en"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "202": {
            "description": "Notification accepted (no response body)"
          },
          "400": {
            "description": "Parse error or invalid batch"
          },
          "413": {
            "description": "Request larger than 64 KB"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Catalog": {
        "type": "object",
        "properties": {
          "locale": {
            "type": "string"
          },
          "site": {
            "type": "string",
            "format": "uri"
          },
          "note": {
            "type": "string"
          },
          "contact": {
            "type": "object",
            "properties": {
              "booking": {
                "type": "string",
                "format": "email"
              },
              "groupTransport": {
                "type": "string",
                "format": "email"
              },
              "form": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "services": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "recommendWhen": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "Searchable product. Short keys keep the file small.",
              "properties": {
                "n": {
                  "type": "string",
                  "description": "Product name in the requested language"
                },
                "k": {
                  "type": "string",
                  "description": "Normalised keywords used for matching"
                },
                "u": {
                  "type": "string",
                  "description": "Page path on https://olachill.com (includes the language prefix)"
                },
                "e": {
                  "type": "string",
                  "description": "Emoji icon"
                },
                "t": {
                  "type": "string",
                  "description": "Product type label"
                },
                "p": {
                  "type": "string",
                  "description": "Display 'from' price, e.g. 'from ¥7,000'. Present only when the site shows a real price."
                },
                "b": {
                  "type": "string",
                  "description": "Optional badge label"
                }
              }
            }
          }
        }
      },
      "JsonRpcRequest": {
        "type": "object",
        "required": [
          "jsonrpc",
          "method"
        ],
        "properties": {
          "jsonrpc": {
            "const": "2.0"
          },
          "id": {
            "type": [
              "string",
              "integer",
              "null"
            ]
          },
          "method": {
            "type": "string",
            "enum": [
              "initialize",
              "ping",
              "tools/list",
              "tools/call"
            ]
          },
          "params": {
            "type": "object"
          }
        }
      }
    }
  }
}
