Vacation-rental registry, Italy: search homes, see who proved they rent them, contact them directly.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Full passport of one property: attributes stated by the operator (provenance says who states them and when they changed; they are not checked by Ospitario), the pool's stated facets (null: not stated), tier and date, registration status, direct contact, blocked dates, liability insurance and safety equipment as declared by the operator, priceFrom (indicative, negotiated directly, no booking), and the page link to hand to the traveler. No booking through Ospitario; an inquiry can be sent to the operator with send_inquiry, or the traveler uses the direct contact on the passport. Insurance status and safety equipment are host-declared, not verified: Ospitario has seen no policy and no device. Availability is a hint, never a booking commitment: a night not blocked in the operator's synced calendar may already be taken, since the calendar is a copy that can lag behind; only the operator confirms availability, and Ospitario holds or books nothing. Prices are indicative, stated by the host (on an unclaimed passport: taken from the official website), negotiated directly with the host; there is no booking through Ospitario. Every result is a property with a proven listing (L2/L2c), a verified operator (L3), a right to manage verified by document review (LA) or, marked L0 and unclaimed, facts from the operator's official website with nothing proven; the result names the tier and the date it was reached, and whether the registration number (Italy: CIN) was checked against the public register. Contact is direct with the operator and commission-free, so the traveler pays no platform fee. No result means nothing proven matches; nothing is inferred, estimated or filled in.
Passport slug from a search or lookup result
Language of labels in the result; defaults to en
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http ospitario https://ospitario.com/mcp
Full passport of one property: attributes stated by the operator (provenance says who states them and when they changed; they are not checked by Ospitario), the pool's stated facets (null: not stated), tier and date, registration status, direct contact, blocked dates, liability insurance and safety equipment as declared by the operator, priceFrom (indicative, negotiated directly, no booking), and the page link to hand to the traveler. No booking through Ospitario; an inquiry can be sent to the operator with send_inquiry, or the traveler uses the direct contact on the passport. Insurance status and safety equipment are host-declared, not verified: Ospitario has seen no policy and no device. Availability is a hint, never a booking commitment: a night not blocked in the operator's synced calendar may already be taken, since the calendar is a copy that can lag behind; only the operator confirms availability, and Ospitario holds or books nothing. Prices are indicative, stated by the host (on an unclaimed passport: taken from the official website), negotiated directly with the host; there is no booking through Ospitario. Every result is a property with a proven listing (L2/L2c), a verified operator (L3), a right to manage verified by document review (LA) or, marked L0 and unclaimed, facts from the operator's official website with nothing proven; the result names the tier and the date it was reached, and whether the registration number (Italy: CIN) was checked against the public register. Contact is direct with the operator and commission-free, so the traveler pays no platform fee. No result means nothing proven matches; nothing is inferred, estimated or filled in.
| Argument | Type | Description |
|---|---|---|
| lang | string | Language of labels in the result; defaults to en |
| slug* | string | Passport slug from a search or lookup result |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"lang": {
"enum": [
"it",
"de",
"en",
"es",
"pt",
"fr"
],
"type": "string",
"description": "Language of labels in the result; defaults to en"
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
"description": "Passport slug from a search or lookup result"
}
}
}Where Ospitario has public passports: every municipality with at least one, its region (Italy) and country, how many passports (and how many of them unclaimed, tier L0), and its list page. Call it when the traveler names an area, before searching: a place not listed has no passport on Ospitario yet; say so instead of searching it. Coverage is still small and grows week by week. Every result is a property with a proven listing (L2/L2c), a verified operator (L3), a right to manage verified by document review (LA) or, marked L0 and unclaimed, facts from the operator's official website with nothing proven; the result names the tier and the date it was reached, and whether the registration number (Italy: CIN) was checked against the public register. Contact is direct with the operator and commission-free, so the traveler pays no platform fee. No result means nothing proven matches; nothing is inferred, estimated or filled in.
| Argument | Type | Description |
|---|---|---|
| lang | string | Language of labels in the result; defaults to en |
| country | string | ISO 3166-1 alpha-2 country code to list: IT, DE, ES, FR or PT; all when omitted |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lang": {
"enum": [
"it",
"de",
"en",
"es",
"pt",
"fr"
],
"type": "string",
"description": "Language of labels in the result; defaults to en"
},
"country": {
"enum": [
"IT",
"DE",
"ES",
"FR",
"PT"
],
"type": "string",
"description": "ISO 3166-1 alpha-2 country code to list: IT, DE, ES, FR or PT; all when omitted"
}
}
}Find passports by property name: exact or prefix match, at least 3 characters, at most 10 results, exact match first, then alphabetical. Optionally limited to a municipality. Every result is a property with a proven listing (L2/L2c), a verified operator (L3), a right to manage verified by document review (LA) or, marked L0 and unclaimed, facts from the operator's official website with nothing proven; the result names the tier and the date it was reached, and whether the registration number (Italy: CIN) was checked against the public register. Contact is direct with the operator and commission-free, so the traveler pays no platform fee. No result means nothing proven matches; nothing is inferred, estimated or filled in.
| Argument | Type | Description |
|---|---|---|
| lang | string | Language of labels in the result; defaults to en |
| name* | string | Property name or its beginning, at least 3 characters |
| municipality | string | Exact municipality name |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"lang": {
"enum": [
"it",
"de",
"en",
"es",
"pt",
"fr"
],
"type": "string",
"description": "Language of labels in the result; defaults to en"
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 3,
"description": "Property name or its beginning, at least 3 characters"
},
"municipality": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "Exact municipality name"
}
}
}Resolve a listing link (Airbnb, Booking, Vrbo) to the operator's Ospitario passport, e.g. when a traveler wants to book a place they know directly. Exact match on the listing's own L2/L2c proof or found:false; never a list; a property verified only as an operator (L3) or an unclaimed passport (L0) is never returned for a link. The link is only parsed, never opened. Insurance status and safety equipment are host-declared, not verified: Ospitario has seen no policy and no device. Every result is a property with a proven listing (L2/L2c), a verified operator (L3), a right to manage verified by document review (LA) or, marked L0 and unclaimed, facts from the operator's official website with nothing proven; the result names the tier and the date it was reached, and whether the registration number (Italy: CIN) was checked against the public register. Contact is direct with the operator and commission-free, so the traveler pays no platform fee. No result means nothing proven matches; nothing is inferred, estimated or filled in.
| Argument | Type | Description |
|---|---|---|
| url* | string | Link to a listing on Airbnb, Booking or Vrbo |
| lang | string | Language of labels in the result; defaults to en |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"minLength": 10,
"description": "Link to a listing on Airbnb, Booking or Vrbo"
},
"lang": {
"enum": [
"it",
"de",
"en",
"es",
"pt",
"fr"
],
"type": "string",
"description": "Language of labels in the result; defaults to en"
}
}
}Find vacation rentals in a municipality or region (Italy, Germany, Spain, France, Portugal) for a number of guests. Where: municipality, province, (Italy) region, or a radius around an Italian municipality (near) or a point (latitude/longitude), each hit with its straight-line distance; the order stays tier, then name, sort by distance yourself. Criteria: capacity, bedrooms, bathrooms, amenities (a fixed table of names incl. pool facets such as private or heated, otherwise exact), what is rented, pets allowed, highest indicative price and, with from/to, dates not blocked in the operator's synced calendar. A stated fact that contradicts a criterion always leaves the property out. Each hit lists the criteria a stated fact meets in matched and says match (every criterion met) or possible, with the open points in unknown: by default only availability on request and a heated pool's heating on the requested dates; with include_possible also any fact the operator did not state (no current calendar is never read as free). Ask the operator about every point in unknown before relying on it. At most 20 results, ordered by the strongest free tier, then name (with include_possible matches first); the paid tier L5 does not change the order. No ranking by anything else, no fuzzy matching. Each result has priceFrom (indicative, negotiated directly, no booking) and the next window not blocked in the operator's calendar. Availability is a hint, never a booking commitment: a night not blocked in the operator's synced calendar may already be taken, since the calendar is a copy that can lag behind; only the operator confirms availability, and Ospitario holds or books nothing. Prices are indicative, stated by the host (on an unclaimed passport: taken from the official website), negotiated directly with the host; there is no booking through Ospitario. Every result is a property with a proven listing (L2/L2c), a verified operator (L3), a right to manage verified by document review (LA) or, marked L0 and unclaimed, facts from the operator's official website with nothing proven; the result names the tier and the date it was reached, and whether the registration number (Italy: CIN) was checked against the public register. Contact is direct with the operator and commission-free, so the traveler pays no platform fee. No result means nothing proven matches; nothing is inferred, estimated or filled in.
Send one inquiry from a traveler to the operator of a passport, by email through Ospitario (no booking, no payment, no commission). Two steps, and only with the traveler's consent: first call without code; Ospitario mails a six-digit code and a confirmation link to guest_email. Ask the traveler for the code, then call again with challengeId and code; if the traveler confirmed with the link instead, the inquiry is already sent and that call answers refused with reason used. The operator replies to the traveler's address directly. For an unclaimed passport (L0) this is the only way to write. Limits: 3 per traveler email and day, 10 per operator and day, identical messages once. When sent, the answer carries a reference that the operator's mail names too; give it to the traveler.
| Argument | Type | Description |
|---|---|---|
| to | string | Checkout date YYYY-MM-DD; requires from |
| code | string | The six-digit code the traveler received by email, for step 2 |
| from | string | Check-in date YYYY-MM-DD; requires to |
| lang | string | Language of labels in the result; defaults to en |
| slug* | string | Passport slug from a search or lookup result |
| guests* | integer | Number of guests |
| message* | string |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 11, 2026.
| Argument | Type | Description |
|---|
| to | string | Checkout date YYYY-MM-DD; requires from |
| from | string | Check-in date YYYY-MM-DD; requires to |
| lang | string | Language of labels in the result; defaults to en |
| near | string | Italian municipality to search around, by name (e.g. Lecce); with radiusKm. A name several municipalities carry needs nearProvince |
| pets | boolean | true: only properties whose operator states that pets are allowed |
| guests* | integer | Number of guests; properties with a lower capacity are left out |
| region | string | Italian region, by its Italian name or slug (Abruzzo, Basilicata, Calabria, Campania, Emilia-Romagna, Friuli-Venezia Giulia, Lazio, Liguria, Lombardia, Marche, Molise, Piemonte, Puglia, Sardegna, Sicilia, Toscana, Trentino-Alto Adige, Umbria, Valle d’Aosta, Veneto); the usual English, German, French, Spanish and Portuguese names are understood too (Apulia, Toskana). Italy only; matches the passport's province |
| country | string | ISO 3166-1 alpha-2 country code: IT, DE, ES, FR or PT |
| bedrooms | integer | Minimum number of bedrooms |
| children | boolean | true: only properties whose operator states that children are welcome |
| latitude | number | Point to search around, WGS 84 degrees; with longitude and radiusKm, instead of near |
| maxPrice | integer | Highest indicative price per night in EUR: properties whose lowest current or future priceFrom is above it, or that gave no price, are left out |
| province | string | Region code within the country, ISO 3166-2 without the prefix: IT/ES province (LE), FR département (75), DE Land (HH), PT distrito (11) |
| radiusKm | integer | Radius around near or latitude/longitude in km, straight line, default 20. A passport counts at its published exact location, else at its municipality's centre (computed from Istat's boundaries), so a home just inside a municipality can lie a few km off; every hit names its distance and basis. Municipality centres computed by Ospitario from Istat, Confini delle unità amministrative a fini statistici al 1° gennaio 2026 (CC BY 4.0) |
| stepFree | boolean | true: only properties whose operator states step-free access |
| amenities | array | Every listed amenity must be present. These names match the operator's wording in any of the six languages through a fixed table: pool, wifi, parking, airConditioning (ac), garden, seaView, terrace, kitchen, washingMachine (washerDryer), bbq (outdoorGrill), heating, fireplace, balcony, tv, hotTub, elevator, crib, microwave, workspace. A pool can be asked with its facets: "private pool", "shared pool", "heated pool", "indoor pool", "outdoor pool" (or the same words in Italian, German, Spanish, Portuguese, French); a facet the operator did not state is unknown, not a match. Any other word must match an amenity exactly (case-insensitive). |
| bathrooms | number | Minimum number of bathrooms; a half bath counts 0.5 |
| longitude | number | Point to search around, WGS 84 degrees; with latitude |
| placeKind | string | entire, private_room or shared_room; properties that did not state it are left out |
| municipality | string | Exact municipality name, e.g. Lecce |
| nearProvince | string | Province code of near when the name is ambiguous (e.g. LE) |
| propertyKind | string | Kind of building: apartment, house, villa, farmhouse, trullo, cottage, chalet, other; a property that did not state it is open (unknown: propertyKind), another kind leaves it out |
| include_possible | boolean | true: also return possible matches, where a requested fact is not stated (capacity, bedrooms, an amenity or pool facet, pets, price, current calendar) and nothing stated contradicts the request; each hit names the open points in unknown. Default false: only hits that meet every criterion, plus availability on request. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"guests"
],
"properties": {
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Checkout date YYYY-MM-DD; requires from"
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Check-in date YYYY-MM-DD; requires to"
},
"lang": {
"enum": [
"it",
"de",
"en",
"es",
"pt",
"fr"
],
"type": "string",
"description": "Language of labels in the result; defaults to en"
},
"near": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "Italian municipality to search around, by name (e.g. Lecce); with radiusKm. A name several municipalities carry needs nearProvince"
},
"pets": {
"type": "boolean",
"const": true,
"description": "true: only properties whose operator states that pets are allowed"
},
"guests": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Number of guests; properties with a lower capacity are left out"
},
"region": {
"type": "string",
"maxLength": 40,
"minLength": 2,
"description": "Italian region, by its Italian name or slug (Abruzzo, Basilicata, Calabria, Campania, Emilia-Romagna, Friuli-Venezia Giulia, Lazio, Liguria, Lombardia, Marche, Molise, Piemonte, Puglia, Sardegna, Sicilia, Toscana, Trentino-Alto Adige, Umbria, Valle d’Aosta, Veneto); the usual English, German, French, Spanish and Portuguese names are understood too (Apulia, Toskana). Italy only; matches the passport's province"
},
"country": {
"enum": [
"IT",
"DE",
"ES",
"FR",
"PT"
],
"type": "string",
"description": "ISO 3166-1 alpha-2 country code: IT, DE, ES, FR or PT"
},
"bedrooms": {
"type": "integer",
"maximum": 30,
"minimum": 0,
"description": "Minimum number of bedrooms"
},
"children": {
"type": "boolean",
"const": true,
"description": "true: only properties whose operator states that children are welcome"
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "Point to search around, WGS 84 degrees; with longitude and radiusKm, instead of near"
},
"maxPrice": {
"type": "integer",
"maximum": 100000,
"minimum": 1,
"description": "Highest indicative price per night in EUR: properties whose lowest current or future priceFrom is above it, or that gave no price, are left out"
},
"province": {
"type": "string",
"maxLength": 3,
"minLength": 1,
"description": "Region code within the country, ISO 3166-2 without the prefix: IT/ES province (LE), FR département (75), DE Land (HH), PT distrito (11)"
},
"radiusKm": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Radius around near or latitude/longitude in km, straight line, default 20. A passport counts at its published exact location, else at its municipality's centre (computed from Istat's boundaries), so a home just inside a municipality can lie a few km off; every hit names its distance and basis. Municipality centres computed by Ospitario from Istat, Confini delle unità amministrative a fini statistici al 1° gennaio 2026 (CC BY 4.0)"
},
"stepFree": {
"type": "boolean",
"const": true,
"description": "true: only properties whose operator states step-free access"
},
"amenities": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"maxItems": 20,
"description": "Every listed amenity must be present. These names match the operator's wording in any of the six languages through a fixed table: pool, wifi, parking, airConditioning (ac), garden, seaView, terrace, kitchen, washingMachine (washerDryer), bbq (outdoorGrill), heating, fireplace, balcony, tv, hotTub, elevator, crib, microwave, workspace. A pool can be asked with its facets: \"private pool\", \"shared pool\", \"heated pool\", \"indoor pool\", \"outdoor pool\" (or the same words in Italian, German, Spanish, Portuguese, French); a facet the operator did not state is unknown, not a match. Any other word must match an amenity exactly (case-insensitive)."
},
"bathrooms": {
"type": "number",
"maximum": 20,
"minimum": 0,
"multipleOf": 0.5,
"description": "Minimum number of bathrooms; a half bath counts 0.5"
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "Point to search around, WGS 84 degrees; with latitude"
},
"placeKind": {
"enum": [
"entire",
"private_room",
"shared_room"
],
"type": "string",
"description": "entire, private_room or shared_room; properties that did not state it are left out"
},
"municipality": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "Exact municipality name, e.g. Lecce"
},
"nearProvince": {
"type": "string",
"maxLength": 2,
"minLength": 2,
"description": "Province code of near when the name is ambiguous (e.g. LE)"
},
"propertyKind": {
"enum": [
"apartment",
"house",
"villa",
"farmhouse",
"trullo",
"cottage",
"chalet",
"other"
],
"type": "string",
"description": "Kind of building: apartment, house, villa, farmhouse, trullo, cottage, chalet, other; a property that did not state it is open (unknown: propertyKind), another kind leaves it out"
},
"include_possible": {
"type": "boolean",
"description": "true: also return possible matches, where a requested fact is not stated (capacity, bedrooms, an amenity or pool facet, pets, price, current calendar) and nothing stated contradicts the request; each hit names the open points in unknown. Default false: only hits that meet every criterion, plus availability on request."
}
}
}| The traveler's message to the operator, in the traveler's words |
| challengeId | string | From step 1; send it with code in step 2 |
| guest_email* | string | The traveler's email address; the operator replies there |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug",
"guests",
"message",
"guest_email"
],
"properties": {
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Checkout date YYYY-MM-DD; requires from"
},
"code": {
"type": "string",
"pattern": "^\\d{6}$",
"description": "The six-digit code the traveler received by email, for step 2"
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Check-in date YYYY-MM-DD; requires to"
},
"lang": {
"enum": [
"it",
"de",
"en",
"es",
"pt",
"fr"
],
"type": "string",
"description": "Language of labels in the result; defaults to en"
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{0,79}$",
"description": "Passport slug from a search or lookup result"
},
"guests": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Number of guests"
},
"message": {
"type": "string",
"maxLength": 2000,
"minLength": 10,
"description": "The traveler's message to the operator, in the traveler's words"
},
"challengeId": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "From step 1; send it with code in step 2"
},
"guest_email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 200,
"description": "The traveler's email address; the operator replies there"
}
}
}