{
  "serverInfo": {
    "name": "Hoardo",
    "version": "1.0.0",
    "title": "Hoardo",
    "websiteUrl": "https://www.hoardo.com/connect"
  },
  "authentication": {
    "required": true,
    "schemes": [
      "oauth2"
    ],
    "resourceMetadata": "https://www.hoardo.com/.well-known/oauth-protected-resource/api/mcp"
  },
  "tools": [
    {
      "name": "list_rooms",
      "title": "List rooms",
      "description": "List every room the user owns or has been invited to, with its id and how many boxes and items it has. Start here: the other tools take these ids.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "title": "List rooms",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "search_items",
      "title": "Search things",
      "description": "Search the user's items. Pass several short terms at once (e.g. [\"tent\", \"sleeping bag\", \"camping\", \"headlamp\"]): each is matched against names, notes, codes (barcodes, asset tags), the user's properties (a serial number, a model) and what Hoardo knows about each item (colour, material, use, season). Each item comes back once, with the terms it matched, where it is stored, which lists it is on, and its codes and properties.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "terms": {
            "minItems": 1,
            "maxItems": 12,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 60
            }
          },
          "room_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only search this room; null for all rooms"
          }
        },
        "required": [
          "terms",
          "room_id"
        ]
      },
      "annotations": {
        "title": "Search things",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_inventory",
      "title": "Get the whole inventory",
      "description": "Get everything the user has stored (optionally one room), compactly. Use it when planning broadly, like packing for a trip or finding what's valuable, so nothing relevant is missed. Very large inventories are cut off; then search as well.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "room_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ],
            "description": "Limit to one room; null for all rooms"
          }
        },
        "required": [
          "room_id"
        ]
      },
      "annotations": {
        "title": "Get the whole inventory",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_room",
      "title": "Get a room",
      "description": "Get one room's boxes (each with its number, name, where it stands, the box it's in and how many things are in it), to find a box by its number or name, or to see what's there.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "room_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "room_id"
        ]
      },
      "annotations": {
        "title": "Get a room",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_box",
      "title": "Get a box",
      "description": "Get one box with everything in it.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "box_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "box_id"
        ]
      },
      "annotations": {
        "title": "Get a box",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_lists",
      "title": "Get lists",
      "description": "Get the user's lists (packing lists, lent items, things for sale or to rent out, stocktakes...) with their kind and how many things are on them and ticked off (packed, returned, sold, done or counted, by kind); renting lists say how many things are out with renters, booked and late instead (get_rentals has who and when), and emails: false when the user switched off their emails about pickups, returns and late things. Their default list (default: true) is the one everyone has; it can't be deleted.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "title": "Get lists",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_list_items",
      "title": "Get a list's things",
      "description": "Get what's on one list (things from Hoardo with where they're stored, whole boxes with what's in them, and things only on the list), with whether each is ticked off (packed, returned, sold, done or counted, by the list's kind) and what the list keeps about it. On a stocktake, each thing says how many are expected and how many were counted. On a renting list, each says what it's doing today instead (rental_state: free, out with someone until a day, booked, to pick up).",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "list_id"
        ]
      },
      "annotations": {
        "title": "Get a list's things",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "add_items",
      "title": "Add things to a box",
      "description": "Add things the user names to one box (up to 50 at a time). Only when they ask to add them.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "box_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "items": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200
                },
                "quantity": {
                  "description": "How many; null when not said",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "price": {
                  "description": "What one is worth, in the user's currency; null when not said",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "notes": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 2000
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Notes about it; null when there are none"
                },
                "category": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 40
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "A category by name, only when the user names one; else null"
                },
                "date": {
                  "description": "A date that matters for it (bought, expires, due), YYYY-MM-DD; else null",
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "name",
                "quantity",
                "price",
                "notes",
                "category",
                "date"
              ]
            }
          }
        },
        "required": [
          "box_id",
          "items"
        ]
      },
      "annotations": {
        "title": "Add things to a box",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "update_items",
      "title": "Update things",
      "description": "Change things' name, quantity, price, notes, category or date (not where they are: move_items does that), and the user's \"Notify me?\" on them: a reminder some days before (or after) the item's date, one before its receipt's warranty ends, or one when its quantity is down to a number (Hoardo tells the user in the app and by email, and get_notifications lists what's coming up). In each change, null leaves a field as it is; `clear` empties fields or takes a reminder away. Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "changes": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "item_id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "name": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 200
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "A new name; null keeps it"
                },
                "quantity": {
                  "description": "How many; null when not said",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "price": {
                  "description": "What one is worth, in the user's currency; null when not said",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "notes": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 2000
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Notes about it; null when there are none"
                },
                "category": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 40
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "A category by name, only when the user names one; else null"
                },
                "date": {
                  "description": "A date that matters for it (bought, expires, due), YYYY-MM-DD; else null",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "notify": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "days": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 365
                        },
                        "after": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "days",
                        "after"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Notify me? about its date: days before it (after false) or after it; it needs a date; null keeps it"
                },
                "warranty_notify": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 365
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "A reminder this many days before its receipt's warranty ends; null keeps it"
                },
                "notify_when_down_to": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 100000
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Notify me? once its quantity is down to this many; it needs a quantity; null keeps it"
                },
                "clear": {
                  "maxItems": 8,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "quantity",
                      "price",
                      "notes",
                      "category",
                      "date",
                      "notify",
                      "warranty_notify",
                      "notify_when_down_to"
                    ]
                  },
                  "description": "Fields to empty, and reminders to take away"
                }
              },
              "required": [
                "item_id",
                "name",
                "quantity",
                "price",
                "notes",
                "category",
                "date",
                "notify",
                "warranty_notify",
                "notify_when_down_to",
                "clear"
              ]
            }
          }
        },
        "required": [
          "changes"
        ]
      },
      "annotations": {
        "title": "Update things",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "move_items",
      "title": "Move things",
      "description": "Move things into another box (in any room). Moving something that's out of its box (packed, lent) files it in that box. Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "item_ids": {
            "minItems": 1,
            "maxItems": 200,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "box_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "item_ids",
          "box_id"
        ]
      },
      "annotations": {
        "title": "Move things",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "put_back_items",
      "title": "Put things back",
      "description": "Put things that are out of their box (packed for a trip, lent, rented out, taken out) back in the box they belong in; the list that took each one out lets go of it (unpacked, or returned), and something rented comes back from its rental. Only when the user says they're back.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "item_ids": {
            "minItems": 1,
            "maxItems": 200,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          }
        },
        "required": [
          "item_ids"
        ]
      },
      "annotations": {
        "title": "Put things back",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "delete_items",
      "title": "Delete things",
      "description": "Delete things. They can come back from History in the Hoardo app. Only when the user asks to delete them.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "item_ids": {
            "minItems": 1,
            "maxItems": 200,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          }
        },
        "required": [
          "item_ids"
        ]
      },
      "annotations": {
        "title": "Delete things",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "add_box",
      "title": "Add a box",
      "description": "Add a box to a room, or inside another box there. Every box has a number (what's written on it): without one it gets the next free one. A name is optional. Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "room_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "inside_box_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ],
            "description": "The box it goes in; null for the room itself"
          },
          "number": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 12
              },
              {
                "type": "null"
              }
            ],
            "description": "Its number as written on it (\"12\", or \"A12\" with letters); null for the next one"
          },
          "name": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 120
              },
              {
                "type": "null"
              }
            ],
            "description": "What's in it or what it's for; null for none"
          },
          "location": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 500
              },
              {
                "type": "null"
              }
            ],
            "description": "Where in the room it stands; null for none"
          }
        },
        "required": [
          "room_id",
          "inside_box_id",
          "number",
          "name",
          "location"
        ]
      },
      "annotations": {
        "title": "Add a box",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "update_box",
      "title": "Update a box",
      "description": "Change a box's name, number or where in the room it stands (not its room: move_boxes does that). Null leaves a field as it is; `clear` empties the name or where it stands. Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "box_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "name": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 120
              },
              {
                "type": "null"
              }
            ],
            "description": "A new name; null keeps it"
          },
          "number": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 12
              },
              {
                "type": "null"
              }
            ],
            "description": "A new number; null keeps it"
          },
          "location": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 500
              },
              {
                "type": "null"
              }
            ],
            "description": "Where it stands now; null keeps it"
          },
          "clear": {
            "maxItems": 2,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "name",
                "location"
              ]
            }
          }
        },
        "required": [
          "box_id",
          "name",
          "number",
          "location",
          "clear"
        ]
      },
      "annotations": {
        "title": "Update a box",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "move_boxes",
      "title": "Move boxes",
      "description": "Move boxes, with everything in them, to another room or into another box. Each keeps its number when it's free there; else it gets the next free one. Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "box_ids": {
            "minItems": 1,
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "room_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "description": "The room they go to (the room the box is in, when they go into a box)"
          },
          "inside_box_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ],
            "description": "The box they go into; null for the room itself"
          }
        },
        "required": [
          "box_ids",
          "room_id",
          "inside_box_id"
        ]
      },
      "annotations": {
        "title": "Move boxes",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "delete_boxes",
      "title": "Delete boxes",
      "description": "Delete boxes with everything in them (the boxes inside them too). They can come back from History in the Hoardo app. Only when the user asks to delete them.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "box_ids": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          }
        },
        "required": [
          "box_ids"
        ]
      },
      "annotations": {
        "title": "Delete boxes",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "add_room",
      "title": "Add a room",
      "description": "Add a room (a basement, a storage unit, a cabin). Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          }
        },
        "required": [
          "name"
        ]
      },
      "annotations": {
        "title": "Add a room",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "rename_room",
      "title": "Rename a room",
      "description": "Rename a room. Only when the user asks. Rooms aren't deleted in the chat: people do that from the room's menu.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "room_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          }
        },
        "required": [
          "room_id",
          "name"
        ]
      },
      "annotations": {
        "title": "Rename a room",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "create_list",
      "title": "Create a list",
      "description": "Create a new list, with things from Hoardo (item ids from your tool results), whole boxes (box ids) or rooms, and things that aren't in Hoardo by name. Its kind decides what ticking means: packing (packed), todo (done), lending (returned), selling (sold) or stocktake (counted); renting: what the user rents out (rentals go through book_rental); assets: what a team or a home owns, checked out to people with check_out. Only when the user asks for a list.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60,
            "description": "Short list name, e.g. \"Cabin trip\""
          },
          "kind": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "packing",
                  "todo",
                  "lending",
                  "renting",
                  "selling",
                  "stocktake",
                  "assets"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "What it's for: packing, todo, lending, renting, selling, stocktake or assets; null to go by its name"
          },
          "item_ids": {
            "maxItems": 300,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "box_ids": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "description": "Whole boxes (one entry each, with what's in them)"
          },
          "room_ids": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "description": "Whole rooms: they go on as the boxes in them"
          },
          "names": {
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "description": "Things not stored in Hoardo, by name (they're only on the list)"
          }
        },
        "required": [
          "name",
          "kind",
          "item_ids",
          "box_ids",
          "room_ids",
          "names"
        ]
      },
      "annotations": {
        "title": "Create a list",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "add_to_list",
      "title": "Add to a list",
      "description": "Put things on an existing list: things from Hoardo, whole boxes (or rooms), or things that aren't in Hoardo by name. Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "item_ids": {
            "maxItems": 300,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "box_ids": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "description": "Whole boxes (one entry each, with what's in them)"
          },
          "room_ids": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "description": "Whole rooms: they go on as the boxes in them"
          },
          "names": {
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "description": "Things not stored in Hoardo, by name (they're only on the list)"
          }
        },
        "required": [
          "list_id",
          "item_ids",
          "box_ids",
          "room_ids",
          "names"
        ]
      },
      "annotations": {
        "title": "Add to a list",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "remove_from_list",
      "title": "Remove from a list",
      "description": "Take things off a list (things from Hoardo aren't deleted; things only on the list are gone with it). Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "item_ids": {
            "maxItems": 300,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "box_ids": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "extra_ids": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "description": "Things only on this list, by their extra_id"
          }
        },
        "required": [
          "list_id",
          "item_ids",
          "box_ids",
          "extra_ids"
        ]
      },
      "annotations": {
        "title": "Remove from a list",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "update_list",
      "title": "Update a list",
      "description": "Change a list: rename it, change what it's for (its kind), the word on the button beside each thing, whether ticking things off takes them out of their boxes, whether a renting list emails the user about pickups, returns and late things, and put a selling or renting list on the user's public sale page or take it off. Making a list renting or assets unmarks everything on it (nothing is rented or checked out yet; Undo puts the marks back), and changing a list into or out of renting takes it off the sale page (on_sale_page true in the same call keeps it on). Null leaves a setting as it is. Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "name": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 60
              },
              {
                "type": "null"
              }
            ]
          },
          "kind": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "packing",
                  "todo",
                  "lending",
                  "renting",
                  "selling",
                  "stocktake",
                  "assets"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "packing, todo, lending, renting, selling, stocktake or assets; null keeps it. Lending and assets turn into each other keeping who has what; an asset list with things checked out can't become anything else"
          },
          "button_word": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 20
              },
              {
                "type": "null"
              }
            ],
            "description": "What the button beside each thing says, instead of the kind's word (\"Unpacked\"); \"\" goes back to the kind's; null keeps it"
          },
          "takes_out": {
            "description": "Whether things packed (packing), lent (lending), rented out (renting) or checked out (assets) count as out of their boxes until they're put back; null keeps it",
            "type": [
              "boolean",
              "null"
            ]
          },
          "rental_emails": {
            "description": "Renting lists: whether Hoardo emails the user on the mornings things are picked up or due back, and about late things; null keeps it",
            "type": [
              "boolean",
              "null"
            ]
          },
          "on_sale_page": {
            "description": "Selling and renting lists: true puts it on the user's public sale page (what's for sale and the prices; what's to rent, its prices, deposits and the days it's booked, where people can ask for dates; never where things are or who has them), false takes it off; null keeps it",
            "type": [
              "boolean",
              "null"
            ]
          },
          "sale_page_note": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 500
              },
              {
                "type": "null"
              }
            ],
            "description": "What the sale page says about buying or renting (\"Pick-up in Aarhus, cash or MobilePay\"); \"\" empties it; null keeps it"
          }
        },
        "required": [
          "list_id",
          "name",
          "kind",
          "button_word",
          "takes_out",
          "rental_emails",
          "on_sale_page",
          "sale_page_note"
        ]
      },
      "annotations": {
        "title": "Update a list",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "tick_on_list",
      "title": "Tick things on a list",
      "description": "Tick things off on a list, or untick them. A tick means what the list's button means for its kind: packing packed, lending returned (things on a lending list are lent until they're ticked off), selling sold, to-do done, stocktake counted (all that's expected are there: count_on_list says how many), assets checked out (check_out says to whom; unticking checks them in). Ticking on a packing list takes things out of their boxes, unless its takes_out is off; ticking on a lending list puts them back. Renting lists aren't ticked: things go out and come back with rentals (book_rental, update_rental). Only when the user says so.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "item_ids": {
            "maxItems": 300,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "box_ids": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "extra_ids": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "done": {
            "type": "boolean",
            "description": "true ticks them off, false unticks them"
          }
        },
        "required": [
          "list_id",
          "item_ids",
          "box_ids",
          "extra_ids",
          "done"
        ]
      },
      "annotations": {
        "title": "Tick things on a list",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "update_list_entries",
      "title": "Update list entries",
      "description": "Note what a list keeps about things on it: who has something and until when, and a reminder (lending, and assets while checked out), prices, the sale, the listing and whether it's reserved (selling), when it's due (to-do), its price per day or per rental and its deposit (renting). Null leaves a field as it is; `clear` empties fields. Put the thing on the list first if it isn't. Counts on a stocktake go through count_on_list; who has something on a renting list goes through book_rental.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "entries": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "item_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "box_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "extra_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lent_to": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 80
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Who has it (lending; assets while checked out)"
                },
                "since": {
                  "description": "Lent or checked out since, YYYY-MM-DD",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "due_back": {
                  "description": "When it's due back, YYYY-MM-DD",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "asking": {
                  "description": "Asking price (selling)",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "cost": {
                  "description": "What it cost them (selling)",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "sold_for": {
                  "description": "What it sold for",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "fees": {
                  "description": "Fees on the sale",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "sold_on": {
                  "description": "When it sold, YYYY-MM-DD",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "sold_where": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 60
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Where it sold (a marketplace)"
                },
                "due": {
                  "description": "When it's due (to-do), YYYY-MM-DD",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "reserved": {
                  "description": "Someone has it on hold (selling: the sale page says reserved); false: not anymore",
                  "type": [
                    "boolean",
                    "null"
                  ]
                },
                "listing": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "title": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "text": {
                          "type": "string",
                          "maxLength": 4000
                        }
                      },
                      "required": [
                        "title",
                        "text"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "The listing's title and text, for selling it"
                },
                "reminder": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "days": {
                          "type": "number"
                        },
                        "after": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "days",
                        "after"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Lending and assets: email the user this many days before due_back (after: true, after it; 0 is on the day)"
                },
                "rate": {
                  "description": "Renting: the thing's price, per day or per rental (rate_per)",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "rate_per": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "day",
                        "rental"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Renting: what rate is charged by: day (the back-by day is free) or rental"
                },
                "deposit": {
                  "description": "Renting: the deposit asked for it",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "clear": {
                  "maxItems": 16,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "lent_to",
                      "since",
                      "due_back",
                      "asking",
                      "cost",
                      "sold_for",
                      "fees",
                      "sold_on",
                      "sold_where",
                      "due",
                      "reserved",
                      "listing",
                      "reminder",
                      "rate",
                      "rate_per",
                      "deposit"
                    ]
                  },
                  "description": "Fields to empty"
                }
              },
              "required": [
                "item_id",
                "box_id",
                "extra_id",
                "lent_to",
                "since",
                "due_back",
                "asking",
                "cost",
                "sold_for",
                "fees",
                "sold_on",
                "sold_where",
                "due",
                "reserved",
                "listing",
                "reminder",
                "rate",
                "rate_per",
                "deposit",
                "clear"
              ]
            }
          }
        },
        "required": [
          "list_id",
          "entries"
        ]
      },
      "annotations": {
        "title": "Update list entries",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "count_on_list",
      "title": "Count on a stocktake",
      "description": "Count things on a stocktake list: how many are there (counted), or some more (add; negative for fewer). For a thing inside a whole box on the list, give its item_id and the box it's in as in_box_id (that box, or any box inside it). Counts stay until the thing is unticked. Only when the user says what they counted.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "counts": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "item_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "box_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "extra_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "in_box_id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "For a thing in a whole box on the list: the box it's in (or the whole box); else null"
                },
                "counted": {
                  "description": "How many there are; null to add instead",
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "add": {
                  "description": "How many more (negative: fewer); null when counted is given",
                  "type": [
                    "number",
                    "null"
                  ]
                }
              },
              "required": [
                "item_id",
                "box_id",
                "extra_id",
                "in_box_id",
                "counted",
                "add"
              ]
            }
          }
        },
        "required": [
          "list_id",
          "counts"
        ]
      },
      "annotations": {
        "title": "Count on a stocktake",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "use_counted_quantities",
      "title": "Use counted quantities",
      "description": "Make Hoardo's quantities what a stocktake counted: each counted thing whose count differs from its quantity gets the count (one History entry each). Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "list_id"
        ]
      },
      "annotations": {
        "title": "Use counted quantities",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_rentals",
      "title": "Get rentals and availability",
      "description": "Rentals on the user's renting lists (what they rent out): who has what, from which day until the day it's due back (that day is free for the next pickup), what's booked ahead, late, back or cancelled, and the money written down (price, deposit, extra charges, paid). Given from and until it also says, thing by thing, whether it's free on those days and what's in the way. Days are YYYY-MM-DD.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ],
            "description": "One renting list; null for all of them"
          },
          "rental_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ],
            "description": "One rental (from an earlier answer); null for all that fit the rest"
          },
          "status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "live",
                  "booked",
                  "out",
                  "late",
                  "back",
                  "cancelled",
                  "all"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "live (null): booked, to pick up or out (soonest first; bookings nobody picked up last); booked: not handed over yet; out: with the renter now (late ones too); late; back; cancelled; all (back, cancelled and all: latest first)"
          },
          "from": {
            "description": "YYYY-MM-DD: with until, only rentals on those days, and whether each thing is free then",
            "type": [
              "string",
              "null"
            ]
          },
          "until": {
            "description": "YYYY-MM-DD: the day it would come back (with rental_id: whether it can have those days instead)",
            "type": [
              "string",
              "null"
            ]
          },
          "item_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Only rentals with these things, and with from and until: are they free? (null: a rental's own things, or the whole list)"
          },
          "box_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "extra_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Things only on the list, by their extra_id"
          }
        },
        "required": [
          "list_id",
          "rental_id",
          "status",
          "from",
          "until",
          "item_ids",
          "box_ids",
          "extra_ids"
        ]
      },
      "annotations": {
        "title": "Get rentals and availability",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "book_rental",
      "title": "Rent out or book",
      "description": "Rents things out from one of the user's renting lists, now or booked ahead: the renter (a name, as they said it), from (null: today) and until (the day it's due back, YYYY-MM-DD), and things on that list (add_to_list them first). Hoardo refuses days when something is booked or still out with someone else, and says what's in the way. price null works it out from the things' prices; deposit null adds up theirs. hand_over_now null hands them over when it starts today. Hoardo never takes payments: prices are only written down.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "renter": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Who rents it, as the user said it"
          },
          "contact": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 254
              },
              {
                "type": "null"
              }
            ],
            "description": "Their phone or email, if the user gave it"
          },
          "from": {
            "description": "The first day, YYYY-MM-DD; null: today",
            "type": [
              "string",
              "null"
            ]
          },
          "until": {
            "type": "string",
            "description": "The day it's due back, YYYY-MM-DD (free for the next pickup)"
          },
          "item_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "box_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Whole boxes on the list: they go out as a kit, with what's in them"
          },
          "extra_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Things only on the list, by their extra_id"
          },
          "quantities": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "item_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "how_many": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "item_id",
                    "how_many"
                  ]
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Some of an item that has a quantity (4 of 10 chairs); null: all of each"
          },
          "price": {
            "description": "What the rental costs, as agreed; null: from the things' prices",
            "type": [
              "number",
              "null"
            ]
          },
          "deposit": {
            "description": "The deposit asked for; null: the things' deposits added up",
            "type": [
              "number",
              "null"
            ]
          },
          "note": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 1000
              },
              {
                "type": "null"
              }
            ]
          },
          "hand_over_now": {
            "description": "true: they have it now; false: booked, handed over later; null: now when it starts today",
            "type": [
              "boolean",
              "null"
            ]
          },
          "request_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ],
            "description": "The request for dates from the sale page this books (its message_id from get_notifications): their contact goes on the rental, and the request is dealt with; null: none"
          }
        },
        "required": [
          "list_id",
          "renter",
          "contact",
          "from",
          "until",
          "item_ids",
          "box_ids",
          "extra_ids",
          "quantities",
          "price",
          "deposit",
          "note",
          "hand_over_now",
          "request_id"
        ]
      },
      "annotations": {
        "title": "Rent out or book",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "update_rental",
      "title": "Update a rental",
      "description": "Changes a rental (ids from get_rentals). step: hand_over (they picked it up; things null hands over everything still to go; stays_home for things in a box that don't go out with it), take_back (it came back; things null is everything, quantities for some of an item, damaged_ids for what came back damaged; a box comes back as a kit, with missing for what it came back without, which stays out with the renter), or cancel (only before anything went out). Or, without a step, change it: renter, contact, from, until (moving the back-by day extends or shortens it; Hoardo checks the new days), price, deposit, extra_charges, paid, deposit_returned, note, add_* to add things from its list, remove_* to take off things that haven't gone out. take_back also takes extra_charges, paid, deposit_returned and note (how it came back, up to 500 characters). Only when the user says so.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "rental_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "step": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "hand_over",
                  "take_back",
                  "cancel"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "null: change it instead"
          },
          "item_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "What the step is about; null with box_ids and extra_ids: all of it"
          },
          "box_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "extra_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "quantities": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "item_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "how_many": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "item_id",
                    "how_many"
                  ]
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "take_back: how many of an item came back (the rest stays out); else how many of an item add_item_ids adds"
          },
          "damaged_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "take_back: what came back damaged (item, box or extra ids)"
          },
          "stays_home": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "box_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "item_ids": {
                      "maxItems": 200,
                      "type": "array",
                      "items": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                      }
                    }
                  },
                  "required": [
                    "box_id",
                    "item_ids"
                  ]
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "hand_over: things in a box on the rental that stay home (the box goes out without them)"
          },
          "missing": {
            "anyOf": [
              {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "item_id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "how_many": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "item_id",
                    "how_many"
                  ]
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "take_back: what a box came back without, by the things in it (how_many null: all of it that went out in the box); it stays out with the renter"
          },
          "renter": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "null"
              }
            ]
          },
          "contact": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 254
              },
              {
                "type": "null"
              }
            ],
            "description": "\"\" removes it"
          },
          "from": {
            "description": "A new first day, YYYY-MM-DD (only before it went out)",
            "type": [
              "string",
              "null"
            ]
          },
          "until": {
            "description": "A new back-by day, YYYY-MM-DD",
            "type": [
              "string",
              "null"
            ]
          },
          "price": {
            "type": [
              "number",
              "null"
            ]
          },
          "deposit": {
            "type": [
              "number",
              "null"
            ]
          },
          "extra_charges": {
            "description": "Charged on top (late, damage)",
            "type": [
              "number",
              "null"
            ]
          },
          "paid": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "deposit_returned": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "note": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 1000
              },
              {
                "type": "null"
              }
            ],
            "description": "The rental's note (take_back: how it came back, up to 500 characters); \"\" empties it"
          },
          "add_item_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "add_box_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "add_extra_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "remove_item_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "remove_box_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "remove_extra_ids": {
            "anyOf": [
              {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "rental_id",
          "step",
          "item_ids",
          "box_ids",
          "extra_ids",
          "quantities",
          "damaged_ids",
          "stays_home",
          "missing",
          "renter",
          "contact",
          "from",
          "until",
          "price",
          "deposit",
          "extra_charges",
          "paid",
          "deposit_returned",
          "note",
          "add_item_ids",
          "add_box_ids",
          "add_extra_ids",
          "remove_item_ids",
          "remove_box_ids",
          "remove_extra_ids"
        ]
      },
      "annotations": {
        "title": "Update a rental",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_notifications",
      "title": "Get notifications",
      "description": "What Hoardo tells the user (Settings › Notifications): what's new and what's still waiting for them (unanswered questions, offers and requests for dates from their sale page, pickups, things out with renters or lent and due back, invites), what's coming up (reminders on items' dates and warranties, back-by days, pickups and returns; quantities waiting to run low have no day), and on request what came before. Reading them doesn't mark them as seen. Messages from the sale page come with their conversation. Ids are for the other tools: message_id for reply_to_message, rental_id for update_rental, item_id, list_id.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "which": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "now",
                  "upcoming",
                  "earlier",
                  "all"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "now (null): what's new and what's waiting; upcoming: what's coming up; earlier: what came before; all"
          },
          "days": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1,
                "maximum": 366
              },
              {
                "type": "null"
              }
            ],
            "description": "How far ahead coming up goes; null: 30 days"
          }
        },
        "required": [
          "which",
          "days"
        ]
      },
      "annotations": {
        "title": "Get notifications",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_properties",
      "title": "Get item properties",
      "description": "The user's own item properties (a serial number, a status…: name, type, a dropdown's options, whether Hoardo's AI fills it in), the ones others filled in on things they share, and Hoardo's suggested sets they could add (add_suggested_properties). Each thing's values show where things are listed (search_items, get_box).",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "title": "Get item properties",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_history",
      "title": "Get History",
      "description": "What happened to a thing, a box or a room, newest first: added, moved, changed, checked out to someone and checked in, deleted, and by whom. Give one of item_id, box_id or room_id.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "item_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "box_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "room_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "limit": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1,
                "maximum": 100
              },
              {
                "type": "null"
              }
            ],
            "description": "How many entries, 30 when null"
          }
        },
        "required": [
          "item_id",
          "box_id",
          "room_id",
          "limit"
        ]
      },
      "annotations": {
        "title": "Get History",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "add_suggested_properties",
      "title": "Add suggested properties",
      "description": "Add Hoardo's suggested item properties: a whole set (group: assets for IT and equipment, with serial number, model, status, condition, warranty and the like; home; collections; books) or some of them by key (get_properties lists the keys not added yet). What the user has already stays as it is; a set also switches on the Hoardo properties it goes with (price, barcodes and asset tags, receipts). Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "group": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "assets",
                  "home",
                  "collections",
                  "books"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "A whole set (with keys []), or the set the keys go in; null for keys on their own"
          },
          "keys": {
            "maxItems": 40,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Some suggested properties by key; [] for the whole group"
          }
        },
        "required": [
          "group",
          "keys"
        ]
      },
      "annotations": {
        "title": "Add suggested properties",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "set_item_properties",
      "title": "Set item properties",
      "description": "Set the user's item properties on things (a serial number, a status, a warranty date: by the property's name, get_properties lists them), or clear them (value null). A dropdown takes one of its options; dates are YYYY-MM-DD. Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "changes": {
            "minItems": 1,
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "item_ids": {
                  "minItems": 1,
                  "maxItems": 300,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  }
                },
                "property": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 40,
                  "description": "The property's name"
                },
                "value": {
                  "anyOf": [
                    {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 500
                        },
                        {
                          "type": "number"
                        },
                        {
                          "type": "boolean"
                        }
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "The value, or null to clear it"
                }
              },
              "required": [
                "item_ids",
                "property",
                "value"
              ]
            }
          }
        },
        "required": [
          "changes"
        ]
      },
      "annotations": {
        "title": "Set item properties",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "assign_asset_tags",
      "title": "Give asset tags",
      "description": "Give things numbered asset tags (\"ACME-00042\", from the room owner's counter in Settings › Item properties), kept with their barcodes, so they're found by search and the scanner and printed on labels. Things that have one keep it. Only when the user asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "item_ids": {
            "minItems": 1,
            "maxItems": 300,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          }
        },
        "required": [
          "item_ids"
        ]
      },
      "annotations": {
        "title": "Give asset tags",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "check_out",
      "title": "Check out on an asset list",
      "description": "On an asset list (kind assets): check things out to someone (who has it now, since today, and when it's due back if they say), or hand them on to someone else. Checked out things are out of their boxes until they're checked in (tick_on_list with done false). Put things on the list first (add_to_list) if they aren't. Only when the user says so.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "list_id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "item_ids": {
            "maxItems": 300,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "box_ids": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "extra_ids": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "description": "Things only on this list, by their extra_id"
          },
          "to": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Who has it: a name"
          },
          "due_back": {
            "description": "When it's due back, YYYY-MM-DD; null when not said",
            "type": [
              "string",
              "null"
            ]
          },
          "reminder": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "days": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 365
                  },
                  "after": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "days",
                  "after"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Email the user this many days before due_back (after: true, after it; 0 is on the day)"
          }
        },
        "required": [
          "list_id",
          "item_ids",
          "box_ids",
          "extra_ids",
          "to",
          "due_back",
          "reminder"
        ]
      },
      "annotations": {
        "title": "Check out on an asset list",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      }
    }
  ],
  "resources": [],
  "prompts": []
}