# Create a catalog entry

> The create_catalog_entity MCP tool: create a catalog entry.

`create_catalog_entity` · writes

[REST: `POST /v1/catalog/entities`](https://api.bymundi.com/docs/reference/catalog.entities.create.md)

## What the model reads

Creates a catalog entry, as New in the Catalog: a `destino` (a country, city or zone), a place (`punto`), accommodation (`alojamiento`, needs a Google `placeId`), an activity (`actividad`) or a service (`servicio`). Hang it in the tree with `content.partOf` = the parent's id (search_catalog finds it). If one already exists for the same Google place or `externalId`, the call is refused and names it (`existingId`): update that one instead. Search first to avoid duplicates. Add photos after with upload_catalog_image (or upload_image when offered). undo_change removes it again.

`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 |
|---|---|---|---|
| `kind` | "destino" \| "punto" \| "alojamiento" \| "actividad" \| "servicio" | yes |  |
| `name` | string | yes | 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 |

## Input schema (JSON)

```json
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "destino",
        "punto",
        "alojamiento",
        "actividad",
        "servicio"
      ]
    },
    "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."
    }
  },
  "required": [
    "kind",
    "name"
  ],
  "additionalProperties": false
}
```
