Update a catalog entry
The update_catalog_entity MCP tool: update a catalog entry.
update_catalog_entity · writes · idempotent
REST: PATCH /v1/catalog/entities/{entityId}
What the model reads
Edits a catalog entry (read it first with get_catalog_entity). Send only what changes: content MERGES into the entry's content — an absent field stays; send the empty value to clear one. images REPLACES the photo list: use it to reorder, re-describe (alt) or remove photos, or to attach one you uploaded (by assetId); it cannot add a web URL. Move the entry in the tree with content.partOf. The kind never changes. undo_change reverts it.
content fields by kind — use exactly these names; an unknown field is refused. text fields accept plain text (one paragraph per line). partOf is the parent entry's id: a punto hangs from a destino; nothing hangs from a punto.
Every kind also takes: category: string, features: string[], altNames: string[], estado: borrador|migrado|revisado|publicado|obsoleto, verifiedAt: string (pattern)|null, source: string, reviewNotes: string.
- destino: partOf: uuid|null, intro: text, gettingAround: text, food: text, whenToGo: text, zoneNote: string
- punto: partOf: uuid|null, description: text, tips: text, warnings: text, durationMin: number, hours: {state: unknown|always|scheduled, rules: string, display: string, note: string}, closedWeekdays: mon|tue|wed|thu|fri|sat|sun[], momentsOfDay: amanecer|manana|mediodia|tarde|atardecer|noche[], bestSeasons: primavera|sakura|verano|otono|koyo|invierno|iluminaciones|todo_el_ano[], intensity: baja|media|alta, indoor: boolean, accessibility: unknown|accessible|limited|not, profiles: primera_vez|repetidor|familia_ninos|pareja|grupo|senior|movilidad_reducida|cultural|gastronomico|naturaleza|fotografia|otaku|compras|presupuesto_ajustado|premium[], priority: 1|2|3, paidEntry: boolean, priceNote: string, bookingUrl: string, arrival: text, mapUrl: string, googleFeatureId: string
- alojamiento: partOf: uuid|null, description: text, tips: text, warnings: text, includes: text, accessibility: unknown|accessible|limited|not, checkInWindow: {from: string (pattern), to: string (pattern)}, checkOutTime: string (pattern), mealTimes: {breakfast: string (pattern), dinner: string (pattern), note: string}
- actividad: partOf: uuid|null, description: text, tips: text, warnings: text, durationMin: number|null, hours: {state: unknown|always|scheduled, rules: string, display: string, note: string}, closedWeekdays: mon|tue|wed|thu|fri|sat|sun[], momentsOfDay: amanecer|manana|mediodia|tarde|atardecer|noche[], bestSeasons: primavera|sakura|verano|otono|koyo|invierno|iluminaciones|todo_el_ano[], intensity: baja|media|alta, indoor: boolean, accessibility: unknown|accessible|limited|not, profiles: primera_vez|repetidor|familia_ninos|pareja|grupo|senior|movilidad_reducida|cultural|gastronomico|naturaleza|fotografia|otaku|compras|presupuesto_ajustado|premium[], includes: text, meetingPoint: string, requiresReservation: boolean, fixedTime: boolean, providers: {key: string, name: string, place: object, partOf: uuid|null, notes: string}[], beforeYouGo: text
- servicio: partOf: uuid|null, description: text, tips: text, warnings: text, includes: text, provider: string
Permissions: catalog:write. Undo: the result names a change id; undo_change reverts it.
Input
| Field | Type | Required | Description |
|---|---|---|---|
entityId |
uuid | yes | |
name |
string | max 200 chars | |
placeId |
string | The Google place id. Required for alojamiento. max 300 chars |
|
cityKey |
string | A normalized city key; derived from the name when absent. max 200 chars | |
place |
object | Where it is. The Google place id goes in placeId, not here. |
|
place.lat |
number | null | ||
place.lng |
number | null | ||
place.formattedAddress |
string | max 500 chars | |
content |
object | The kind's own fields — see the list in the description. | |
tags |
string[] | Lowercased and de-duplicated; at most 12. max 12 items | |
externalId |
string | Your system's id for this entry (e.g. a supplier's product code). Unique among the agency's live entries; "" clears it. max 200 chars | |
images |
object[] | The entry's whole photo list, in order. max 30 items | |
images[].assetId |
uuid | An image of this entry, or one uploaded through this API. | |
images[].url |
string | An image of this entry, by the url it already has. max 2000 chars | |
images[].alt |
string | A description of the photo for screen readers. max 300 chars | |
expectedUpdatedAt |
datetime | The entry's updatedAt as you read it. |
Input schema (JSON)
{
"type": "object",
"properties": {
"entityId": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"placeId": {
"type": "string",
"maxLength": 300,
"description": "The Google place id. Required for `alojamiento`."
},
"cityKey": {
"type": "string",
"maxLength": 200,
"description": "A normalized city key; derived from the name when absent."
},
"place": {
"type": "object",
"properties": {
"lat": {
"anyOf": [
{
"type": "number",
"minimum": -90,
"maximum": 90
},
{
"type": "null"
}
]
},
"lng": {
"anyOf": [
{
"type": "number",
"minimum": -180,
"maximum": 180
},
{
"type": "null"
}
]
},
"formattedAddress": {
"type": "string",
"maxLength": 500
}
},
"additionalProperties": false,
"description": "Where it is. The Google place id goes in `placeId`, not here."
},
"content": {
"type": "object",
"additionalProperties": {},
"description": "The kind's own fields — see the list in the description."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"maxItems": 12,
"description": "Lowercased and de-duplicated; at most 12."
},
"externalId": {
"type": "string",
"maxLength": 200,
"description": "Your system's id for this entry (e.g. a supplier's product code). Unique among the agency's live entries; \"\" clears it."
},
"images": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetId": {
"type": "string",
"format": "uuid",
"description": "An image of this entry, or one uploaded through this API."
},
"url": {
"type": "string",
"maxLength": 2000,
"description": "An image of this entry, by the url it already has."
},
"alt": {
"type": "string",
"maxLength": 300,
"description": "A description of the photo for screen readers."
}
},
"additionalProperties": false
},
"maxItems": 30,
"description": "The entry's whole photo list, in order."
},
"expectedUpdatedAt": {
"type": "string",
"format": "date-time",
"description": "The entry's `updatedAt` as you read it."
}
},
"required": [
"entityId"
],
"additionalProperties": false
}