Find places to stay, eat and do, ranked for the question, with live availability and booking.
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.
Reserve a venue offer grounded by match_venues. Pass entityId and the selected offerId. The guest must approve every booking themselves, signed in to their Selfe account: the first call returns status 'approval_required' with approval.url for the guest to open; once they have approved, call again with the same offer and approvalId. A signed mandate alone cannot confirm a booking. No money moves at this step. Returns a confirmation (bookingId) or a conversational next step. Structured JSON.
The opaque, sealed offer id returned by match.
The place id returned by discover or match.
A signed AP2 Cart Mandate for a foreign caller, bound to this entity and offer.
The approval the guest gave this offer in their own Selfe account, returned as approval.id when the booking first needed it. A booking is confirmed only with the guest's approval.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http registry https://selfe.ai/mcp
Reserve a venue offer grounded by match_venues. Pass entityId and the selected offerId. The guest must approve every booking themselves, signed in to their Selfe account: the first call returns status 'approval_required' with approval.url for the guest to open; once they have approved, call again with the same offer and approvalId. A signed mandate alone cannot confirm a booking. No money moves at this step. Returns a confirmation (bookingId) or a conversational next step. Structured JSON.
| Argument | Type | Description |
|---|---|---|
| render | object | |
| mandate | object | A signed AP2 Cart Mandate for a foreign caller, bound to this entity and offer. |
| offerId* | string | The opaque, sealed offer id returned by match. |
| entityId* | string | The place id returned by discover or match. |
| approvalId | string | The approval the guest gave this offer in their own Selfe account, returned as approval.id when the booking first needed it. A booking is confirmed only with the guest's approval. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"entityId",
"offerId"
],
"properties": {
"render": {
"type": "object",
"required": [],
"properties": {
"a2ui": {
"type": "boolean"
},
"catalogs": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"mandate": {
"type": "object",
"description": "A signed AP2 Cart Mandate for a foreign caller, bound to this entity and offer.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"offerId": {
"type": "string",
"maxLength": 4096,
"minLength": 1,
"description": "The opaque, sealed offer id returned by match."
},
"entityId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The place id returned by discover or match."
},
"approvalId": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The approval the guest gave this offer in their own Selfe account, returned as approval.id when the booking first needed it. A booking is confirmed only with the guest's approval."
}
},
"description": "Reserve one current offer for one entity. Its date, party and price are bound inside the sealed offer."
}Search for places to stay, eat and do from a natural-language question. Returns ranked places, recommended areas, and — when you pass `stay` (or the question states dates and party) — live availability whose offer ids go straight to book_venue. Use match_venues instead when the user names a specific place. Structured JSON, not a rendered UI.
| Argument | Type | Description |
|---|---|---|
| stay | object | Optional. When given, results are grounded in live availability and offers for these dates and party. When absent, dates and party written in the question still apply. |
| party | object | Who is travelling, when known without dates (children change what suits). Ignored when `stay` carries its own party. |
| query* | object | |
| render | object | Ask for layout hints alongside the results. Delivery (one body or a stream) is chosen by the Accept header, not here. |
| pageSize | integer | Maximum number of results to return. |
| assumeParty | object | Optional. The party to check live availability for when the question names dates but nobody is counted ("next weekend"). The question's own party, `party` or `stay` always wins; `meta.queryValues.guests` stays empty, so the answer can say the party was assumed. |
Get full details for places the user already means — by id (from discover_venues) or by name, with an optional website and town to tell same-named places apart. Pass `stay` to get live rooms and offers whose offer ids go straight to book_venue. A name that fits several places returns candidates: ask the user which, never guess. Structured JSON, not a rendered UI.
| Argument | Type | Description |
|---|---|---|
| stay | object | When given, each matched place carries its live rooms and offers for these dates and party. |
| places* | array | The places to match: ids, or a name with optional website and location. |
| render | object | Ask for layout hints alongside the results. Delivery (one body or a stream) is chosen by the Accept header, not here. |
| projection | string | `detail` (default) is the full record; `listing` is the compact card a list page needs. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"places"
],
"properties": {
"stay": {
"type": "object",
"required": [
"checkIn",
"checkOut",
"party"
],
"properties": {
"party": {
"type": "object",
"required": [
"adults"
],
"properties": {
"adults": {
"type": "integer",
"maximum": 30,
"description": "Number of adults.",
"exclusiveMinimum": 0
},
"children": {
"type": "integer",
"maximum": 30,
"minimum": 0,
"description": "Number of children."
}
}
},
"checkIn": {
"type": "string",
"minLength": 1,
"description": "Arrival date, ISO YYYY-MM-DD."
},
"checkOut": {
"type": "string",
"minLength": 1,
"description": "Departure date, ISO YYYY-MM-DD."
}
},
"description": "When given, each matched place carries its live rooms and offers for these dates and party."
},
"places": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "A place id from discover or a previous match."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The place name as the caller knows it."
},
"website": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The place's own website, if known; the strongest identity signal."
},
"location": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Town or area, to tell apart places with the same name."
}
},
"additionalProperties": false
}
]
},
"maxItems": 250,
"minItems": 1,
"description": "The places to match: ids, or a name with optional website and location."
},
"render": {
"type": "object",
"required": [],
"properties": {
"a2ui": {
"type": "boolean",
"description": "Also return `ui`: an A2UI surface for the same results. A hint; the results are complete without it."
},
"catalogs": {
"type": "array",
"items": {
"type": "string"
},
"description": "A2UI catalog ids the caller can render."
}
},
"description": "Ask for layout hints alongside the results. Delivery (one body or a stream) is chosen by the Accept header, not here."
},
"projection": {
"enum": [
"detail",
"listing"
],
"type": "string",
"description": "`detail` (default) is the full record; `listing` is the compact card a list page needs."
}
}
}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.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query"
],
"properties": {
"stay": {
"type": "object",
"required": [
"checkIn",
"checkOut",
"party"
],
"properties": {
"party": {
"type": "object",
"required": [
"adults"
],
"properties": {
"adults": {
"type": "integer",
"maximum": 30,
"description": "Number of adults.",
"exclusiveMinimum": 0
},
"children": {
"type": "integer",
"maximum": 30,
"minimum": 0,
"description": "Number of children."
}
}
},
"checkIn": {
"type": "string",
"minLength": 1,
"description": "Arrival date, ISO YYYY-MM-DD."
},
"checkOut": {
"type": "string",
"minLength": 1,
"description": "Departure date, ISO YYYY-MM-DD."
}
},
"description": "Optional. When given, results are grounded in live availability and offers for these dates and party. When absent, dates and party written in the question still apply."
},
"party": {
"type": "object",
"required": [
"adults"
],
"properties": {
"adults": {
"type": "integer",
"maximum": 30,
"description": "Number of adults.",
"exclusiveMinimum": 0
},
"children": {
"type": "integer",
"maximum": 30,
"minimum": 0,
"description": "Number of children."
}
},
"description": "Who is travelling, when known without dates (children change what suits). Ignored when `stay` carries its own party."
},
"query": {
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "Natural-language query, e.g. \"boutique hotels in London with a spa\"."
},
"filter": {
"type": "object",
"description": "Optional dot-path field filters; each value is an array of strings (OR within a field), e.g. {\"tags\":[\"spa\"]}.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"@context": {
"type": "string",
"const": "https://agenticresourcediscovery.org/context/v1",
"description": "Optional ARD v0.91 JSON-LD context."
}
},
"additionalProperties": false
},
"render": {
"type": "object",
"required": [],
"properties": {
"a2ui": {
"type": "boolean",
"description": "Also return `ui`: an A2UI surface for the same results. A hint; the results are complete without it."
},
"catalogs": {
"type": "array",
"items": {
"type": "string"
},
"description": "A2UI catalog ids the caller can render."
}
},
"description": "Ask for layout hints alongside the results. Delivery (one body or a stream) is chosen by the Accept header, not here."
},
"pageSize": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Maximum number of results to return."
},
"assumeParty": {
"type": "object",
"required": [
"adults"
],
"properties": {
"adults": {
"type": "integer",
"maximum": 30,
"description": "Number of adults.",
"exclusiveMinimum": 0
},
"children": {
"type": "integer",
"maximum": 30,
"minimum": 0,
"description": "Number of children."
}
},
"description": "Optional. The party to check live availability for when the question names dates but nobody is counted (\"next weekend\"). The question's own party, `party` or `stay` always wins; `meta.queryValues.guests` stays empty, so the answer can say the party was assumed."
}
}
}