bymundi API

Create a catalog entry

The create_catalog_entity MCP tool: create a catalog entry.

create_catalog_entity · writes

REST: POST /v1/catalog/entities

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.

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)

{
  "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
}