{
  "name": "alpina-travel",
  "title": "Alpina.travel — Lungau",
  "description": "Governed Lungau place, itinerary, and live-availability tools registered by Alpina.travel for agent-capable browsers.",
  "version": "1.0.0",
  "homepage": "https://alpina.travel",
  "specification": {
    "name": "WebMCP",
    "status": "draft",
    "note": "The WebMCP draft does not yet specify a discovery manifest location. This document follows the de-facto /.well-known/webmcp convention and may move when discovery is specified."
  },
  "execution": {
    "context": "browsing-context",
    "note": "These tools execute only inside a live browsing context. This manifest advertises them for pre-visit discovery; it is not itself a callable tool endpoint. Load any Alpina.travel page in an agent-capable browser and read the registered tools from the model context.",
    "api": "document.modelContext.registerTool",
    "fallbacks": [
      "navigator.modelContext.registerTool",
      "navigator.modelContext.provideContext"
    ],
    "registeredOn": "https://alpina.travel/",
    "scope": "Registration runs site-wide from the document head on every page.",
    "overlappingTools": {
      "note": "Three surfaces can check Samspitze 4 availability. They call the same endpoint and return the same data; choose by whether the person should see it happen, not by capability.",
      "rule": [
        "check_samspitze_availability — you consume the result; the page does not change.",
        "prepare_samspitze_availability_check — the person is watching; the visible form is filled and the result renders in it.",
        "check_booking_availability (MCP server) — the client has no browsing context."
      ]
    }
  },
  "alternatives": [
    {
      "protocol": "mcp",
      "transport": "sse",
      "href": "https://alpina.travel/mcp/sse",
      "description": "Model Context Protocol server for clients without a browsing context."
    },
    {
      "protocol": "nlweb",
      "transport": "http",
      "href": "https://alpina.travel/ask",
      "description": "Natural-language search over the same governed knowledge graph."
    },
    {
      "protocol": "http",
      "transport": "http",
      "href": "https://alpina.travel/api/booking/openapi.json",
      "description": "OpenAPI 3.1 contract for the live availability and checkout-handoff bridge."
    },
    {
      "protocol": "linkset",
      "transport": "http",
      "href": "https://alpina.travel/.well-known/api-catalog",
      "description": "RFC 9727 API Catalog listing every machine-readable Alpina.travel surface."
    }
  ],
  "documentation": [
    {
      "href": "https://alpina.travel/for-agents/",
      "type": "text/html"
    },
    {
      "href": "https://alpina.travel/lungau/agent-guide.md",
      "type": "text/markdown"
    },
    {
      "href": "https://alpina.travel/llms.txt",
      "type": "text/plain"
    }
  ],
  "tools": [
    {
      "name": "search_lungau",
      "title": "Search Lungau",
      "description": "Search Alpina.travel's published Lungau knowledge graph. This is read-only and does not create bookings or modify content.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "description": "Natural-language travel question"
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "NLWeb response. Each result is a schema.org ItemList; resolve an item's @id through the JSON feeds rather than rebuilding a page URL from it.",
        "required": [
          "results"
        ],
        "properties": {
          "_meta": {
            "type": "object",
            "properties": {
              "response_type": {
                "type": "string"
              },
              "selected_backend": {
                "type": "string"
              },
              "selected_intent": {
                "type": "string"
              },
              "processing_time_ms": {
                "type": "number"
              },
              "tenant_id": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            },
            "additionalProperties": true
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "@type": {
                  "type": "string",
                  "description": "Typically \"ItemList\"."
                },
                "name": {
                  "type": "string"
                },
                "numberOfItems": {
                  "type": "integer"
                },
                "itemListElement": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "position": {
                        "type": "integer"
                      },
                      "item": {
                        "type": "object",
                        "properties": {
                          "@id": {
                            "type": "string",
                            "description": "Knowledge-graph entity IRI."
                          },
                          "@type": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          },
                          "description": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      }
                    },
                    "additionalProperties": true
                  }
                }
              },
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "annotations": {
        "readOnlyHint": true,
        "untrustedContentHint": true
      }
    },
    {
      "name": "list_lungau_places",
      "title": "List Lungau places",
      "description": "Return governed Alpina.travel place records, optionally filtered by season and family suitability.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "season": {
            "type": "string",
            "description": "Season such as summer, autumn, winter, or spring"
          },
          "goodWithKids": {
            "type": "boolean",
            "description": "When set, filter by family suitability"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20
          }
        },
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "destination",
          "count",
          "places"
        ],
        "properties": {
          "destination": {
            "type": "string"
          },
          "count": {
            "type": "integer",
            "description": "Places returned after filtering and the limit."
          },
          "places": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "canonicalUrl": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Governed Alpina page path. Never rebuild a URL from the id; when this is absent the entity has no Alpina page."
                },
                "agentSummary": {
                  "type": "string"
                },
                "bestSeason": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "goodWithKids": {
                  "type": "boolean"
                },
                "driveMinutesFromBase": {
                  "type": "integer"
                },
                "placeKind": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "untrustedContentHint": true
      }
    },
    {
      "name": "list_lungau_itineraries",
      "title": "List Lungau itineraries",
      "description": "Return governed Lungau itineraries, optionally filtered by season and duration.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "season": {
            "type": "string"
          },
          "durationDays": {
            "type": "integer",
            "minimum": 1,
            "maximum": 14
          }
        },
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "destination",
          "count",
          "itineraries"
        ],
        "properties": {
          "destination": {
            "type": "string"
          },
          "count": {
            "type": "integer",
            "description": "Itineraries returned after filtering."
          },
          "itineraries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "canonicalUrl": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Governed Alpina page path. Never rebuild a URL from the id; when this is absent the entity has no Alpina page."
                },
                "agentSummary": {
                  "type": "string"
                },
                "durationDays": {
                  "type": "integer"
                },
                "bestSeason": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "bestAudience": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "moods": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "recommendedBase": {
                  "type": "string"
                },
                "days": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "untrustedContentHint": true
      }
    },
    {
      "name": "check_samspitze_availability",
      "title": "Check Samspitze 4 availability",
      "description": "Check live Samspitze 4 availability and pricing, and return the result to you directly without changing the page. Read-only: it does not hold dates, create a booking session, or take payment. Prefer this when you consume the answer yourself. If the person is watching the page and should see the dates filled in and the result rendered in the page's own form, use prepare_samspitze_availability_check instead — both call the same endpoint and return the same data, so the only difference is whether the person sees it happen. Clients with no browsing context should use check_booking_availability on the MCP server.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "checkIn": {
            "type": "string",
            "format": "date"
          },
          "checkOut": {
            "type": "string",
            "format": "date"
          },
          "adults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 6
          },
          "childrenAges": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 14
            },
            "maxItems": 5,
            "default": []
          },
          "currency": {
            "type": "string",
            "enum": [
              "EUR"
            ],
            "default": "EUR"
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "de",
              "it"
            ],
            "default": "en"
          }
        },
        "required": [
          "checkIn",
          "checkOut",
          "adults"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Mirrors AvailabilityResult in the booking OpenAPI contract. The quote is time-sensitive: requiresRevalidation is always true and expiresAt bounds the quote, so never present a stale price as current.",
        "required": [
          "propertyId",
          "status",
          "available",
          "checkoutUrl",
          "checkedAt",
          "expiresAt",
          "requiresRevalidation"
        ],
        "properties": {
          "propertyId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "available",
              "unavailable"
            ]
          },
          "available": {
            "type": "boolean"
          },
          "quote": {
            "type": "object",
            "properties": {
              "total": {
                "type": "object",
                "properties": {
                  "amount": {
                    "type": "number"
                  },
                  "currency": {
                    "type": "string",
                    "const": "EUR"
                  }
                }
              },
              "breakdown": {
                "type": "object",
                "properties": {
                  "instantConfirmation": {
                    "type": "boolean"
                  },
                  "cancellationPolicy": {
                    "type": "object"
                  },
                  "taxes": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "stayNotes": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "checkoutPrefillGuaranteed": {
                    "type": "boolean",
                    "const": false,
                    "description": "Always false: the provider page may not retain the dates and guests, so ask the person to confirm them."
                  }
                }
              }
            }
          },
          "checkoutUrl": {
            "type": "string",
            "format": "uri"
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          },
          "requiresRevalidation": {
            "type": "boolean",
            "const": true
          }
        },
        "additionalProperties": true
      },
      "annotations": {
        "readOnlyHint": true,
        "untrustedContentHint": true
      }
    },
    {
      "name": "start_samspitze_checkout",
      "title": "Continue to Samspitze 4 checkout",
      "description": "After the user chooses to continue, show a browser confirmation, recheck live availability, and create a BookingNests checkout handoff. This does not hold dates, reserve the apartment, or take payment. Never report the stay as booked until BookingNests returns a reservation confirmation.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "checkIn": {
            "type": "string",
            "format": "date"
          },
          "checkOut": {
            "type": "string",
            "format": "date"
          },
          "adults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 6
          },
          "childrenAges": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 14
            },
            "maxItems": 5,
            "default": []
          },
          "currency": {
            "type": "string",
            "enum": [
              "EUR"
            ],
            "default": "EUR"
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "de",
              "it"
            ],
            "default": "en"
          }
        },
        "required": [
          "checkIn",
          "checkOut",
          "adults"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "description": "Either a created handoff (BookingSession in the booking OpenAPI contract, plus reservationConfirmed and nextStep) or the cancellation record when the person declines the browser confirmation. reservationConfirmed is false in both cases and this tool can never set it true: only BookingNests confirms a reservation.",
        "oneOf": [
          {
            "type": "object",
            "title": "Checkout handoff created",
            "required": [
              "sessionId",
              "status",
              "checkoutUrl",
              "expiresAt",
              "paymentHandling",
              "checkoutPrefillGuaranteed",
              "reservationConfirmed"
            ],
            "properties": {
              "sessionId": {
                "type": "string",
                "format": "uuid"
              },
              "status": {
                "type": "string",
                "const": "requires_user_checkout"
              },
              "checkoutUrl": {
                "type": "string",
                "format": "uri",
                "description": "Provider-hosted page where the person reviews details and pays."
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time"
              },
              "paymentHandling": {
                "type": "string",
                "const": "provider_checkout_only"
              },
              "checkoutPrefillGuaranteed": {
                "type": "boolean",
                "const": false,
                "description": "Always false: ask the person to verify dates and guests on the provider page."
              },
              "reservationConfirmed": {
                "type": "boolean",
                "const": false,
                "description": "Always false here. Do not report the stay as booked on the strength of this response."
              },
              "nextStep": {
                "type": "string"
              }
            },
            "additionalProperties": true
          },
          {
            "type": "object",
            "title": "Declined at the browser confirmation",
            "required": [
              "status",
              "bookingSessionCreated",
              "reservationConfirmed"
            ],
            "properties": {
              "status": {
                "type": "string",
                "const": "cancelled_by_user"
              },
              "bookingSessionCreated": {
                "type": "boolean",
                "const": false
              },
              "reservationConfirmed": {
                "type": "boolean",
                "const": false
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "untrustedContentHint": true
      }
    }
  ]
}