Serveur MCP

BuildBatch

uk.co.buildbatch/buildbatch
Commerce et retail Public et accessible MCP 2025-11-25

Ce que fait ce MCP

Calculates room-specific DIY shopping lists for materials such as paint, wallpaper, tiles, and flooring.

ask_questions
Questions for a BuildBatch room plan
Get BuildBatch's ordered question script before planning. Ask only what applies, use measurements the person gives you, and do not guess a missing measurement.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'additionalProperties': False}
plan_room
Plan one room with BuildBatch
Work out the whole shopping list for one room from the person's answers. Arguments are the same named parameters as /plan.json. A job is required. Repeated door, window and opening values are arrays. No price is used; price arguments are ignored and named in the answer.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['job'], 'properties': {'v': {'enum': ['1'], 'anyOf': [{'type': 'integer'}, {'type': 'string'}], 'description': 'The version of the format. 1. Left out, 1 is assumed and the answer says so.'}, 'end': {'anyOf': [{'type': 'integer'}, {'type': 'string'}], 'description': 'Written by the planner as the last pair of a list link: the number of pairs before it. Leave it out of a call.'}, 'job': {'enum': ['paint', 'wallpaper', 'tiles', 'flooring', 'carpet', 'loft', 'both', 'paint-carpet', 'skirting', 'plasterboard'], 'type': 'string', 'description': 'The job. Required. wallpaper is the paint job with papered walls and no ceiling; tiles is the paint job with tiled walls and no ceiling; both is paint and a new floor; paint-carpet is paint and one unjoined piece of carpet; skirting is skirting and architrave.'}, 'bath': {'type': 'array', 'items': {'type': 'string', 'description': 'A bath or shower tray: a name (bath-1700, tray-900) or its length along the wall x its rim height x how far it comes into the room, in the units. The wall behind it comes off up to the rim, and its footprint off a floor being laid. The key may be repeated.'}, 'maxItems': 50, 'description': 'A bath or shower tray: a name (bath-1700, tray-900) or its length along the wall x its rim height x how far it comes into the room, in the units. The wall behind it comes off up to the rim, and its footprint off a floor being laid. The key may be repeated.'}, 'door': {'type': 'array', 'items': {'type': 'string', 'description': 'One per door, the key repeated for more. A typical size by name (the names are in /ask.json) or width x height in the units. Add *2 for two the same.'}, 'maxItems': 50, 'description': 'One per door, the key repeated for more. A typical size by name (the names are in /ask.json) or width x height in the units. Add *2 for two the same.'}, 'have': {'type': 'string', 'description': "Line ids, comma separated, to mark Already have before the list is made. The ids are in the answer's lines. Rarely needed."}, 'loft': {'enum': ['quick', 'custom'], 'type': 'string', 'description': 'Whether the loft insulation uses labelled example figures (quick) or figures measured in the loft and read from the chosen roll (custom). Needed for the keys below to take effect.'}, 'name': {'type': 'string', 'description': 'What the room is called. Do not send one: it is carried into the links the answer gives, and the person can add it there.'}, 'need': {'type': 'string', 'description': "Line ids, comma separated, to mark Need before the list is made. The ids are in the answer's lines. Rarely needed."}, 'plan': {'type': 'string', 'description': 'A room that is not a rectangle: its corners in turn, in metres whatever units says, as x,y pairs separated by ";". Replaces length and width. Up to 24 corners.'}, 'trim': {'enum': ['skirting', 'architrave', 'skirting,architrave', 'none'], 'type': 'string', 'description': 'New skirting, architrave or both, with any job. Default skirting for the skirting job, else none.'}, 'board': {'enum': ['quick', 'custom'], 'type': 'string', 'description': 'Whether the plasterboard uses labelled example figures (quick) or figures from the board and system specification (custom). Needed for the keys below to take effect.'}, 'check': {'type': 'string', 'description': "Line ids, comma separated, to mark Check first before the list is made. The ids are in the answer's lines. Rarely needed."}, 'floor': {'enum': ['quick', 'custom'], 'type': 'string', 'description': 'Whether the flooring uses the labelled example figures (quick) or figures read off the pack (custom). Needed for the keys below to take effect.'}, 'paper': {'enum': ['quick', 'custom'], 'type': 'string', 'description': 'Whether the wallpaper is the labelled example roll (quick) or read off the label (custom). Needed for the keys below to take effect.'}, 'units': {'enum': ['m', 'cm', 'mm', 'ft'], 'type': 'string', 'description': 'What length, width, height and the doors are measured in. Default m. In ft write 13ft9in, or 13 for whole feet.'}, 'walls': {'enum': ['paint', 'wallpaper', 'tiles', 'board', 'none'], 'type': 'string', 'description': 'What the walls get. The job sets it, so it is rarely needed: paint, wallpaper, tiles, board or none.'}, 'width': {'type': 'string', 'description': 'The other side of the floor, in the units. Not needed when plan is given.'}, 'carpet': {'enum': ['quick', 'custom'], 'type': 'string', 'description': 'Whether the carpet uses the labelled example roll figures (quick) or figures from the carpet and shop (custom). Needed for the keys below to take effect.'}, 'ground': {'enum': ['yes', 'no', 'unsure'], 'type': 'string', 'description': 'Whether the floor is on the ground floor. Default unsure. Used by flooring jobs.'}, 'height': {'type': 'string', 'description': 'Floor to ceiling, in the units. Needed when walls are painted, papered, tiled or boarded (paint-carpet too); not for flooring, carpet, loft insulation or skirting alone.'}, 'length': {'type': 'string', 'description': 'One side of the floor, in the units. A length may carry its own unit (360cm, 4200mm). Not needed when plan is given.'}, 'window': {'type': 'array', 'items': {'type': 'string', 'description': 'One per window, the key repeated for more. A typical size by name or width x height in the units. Add *2 for two the same.'}, 'maxItems': 50, 'description': 'One per window, the key repeated for more. A typical size by name or width x height in the units. Add *2 for two the same.'}, 'ceiling': {'enum': ['paint', 'board', 'none'], 'type': 'string', 'description': 'What the ceiling gets: paint, board or none.'}, 'fitting': {'enum': ['click', 'glue', 'nail', 'unsure'], 'type': 'string', 'description': 'How the floor is fitted. Default unsure. Used by flooring jobs.'}, 'lengths': {'enum': ['quick', 'custom'], 'type': 'string', 'description': 'Whether the skirting and architrave lengths are the labelled examples (quick) or the lengths the shop sells (custom). Needed for the keys below to take effect.'}, 'opening': {'type': 'array', 'items': {'type': 'string', 'description': 'Any other opening to take off the walls (a garage door, an archway), as width x height or a name. The key may be repeated.'}, 'maxItems': 50, 'description': 'Any other opening to take off the walls (a garage door, an archway), as width x height or a name. The key may be repeated.'}, 'surface': {'enum': ['sound', 'new-bare', 'stained', 'damp-mould', 'flaking-glossy', 'other'], 'type': 'string', 'description': "What the painted surfaces are like now. Default sound, the planner's own default. Used by painting jobs."}, 'subfloor': {'enum': ['timber', 'concrete', 'existing', 'unsure'], 'type': 'string', 'description': 'What is under a new floor. Default unsure. Used by flooring jobs.'}, 'loft.pack': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Square metres covered by one chosen roll or pack.'}, 'wallpaint': {'enum': ['quick', 'custom'], 'type': 'string', 'description': 'Whether the wall paint uses the labelled example figures (quick) or figures read off the tin (custom). Needed for the keys below to take effect.'}, 'walltiles': {'enum': ['quick', 'custom'], 'type': 'string', 'description': 'Whether the wall tiles are the labelled example box (quick) or read off the box (custom). Needed for the keys below to take effect.'}, 'board.skim': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Metres squared one bag of finish plaster covers, from the bag.'}, 'loft.depth': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Thickness of one new mineral-wool layer in millimetres, from the chosen roll.'}, 'loft.extra': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Percent to add for cuts and fitting.'}, 'not-needed': {'type': 'string', 'description': "Line ids, comma separated, to mark Not needed before the list is made. The ids are in the answer's lines. Rarely needed."}, 'board.extra': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Percent to add for cuts.'}, 'board.width': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Board width in metres.'}, 'carpet.step': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'The step in metres in which the shop sells the cut length.'}, 'floor.extra': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Percent to add for cuts. Custom only.'}, 'floor.grout': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Floor tiles: metres squared one bag of grout covers.'}, 'floor.packs': {'type': 'string', 'description': 'Metres squared in one pack or box, comma separated for several sizes. A size may carry a price after "@": the price is accepted and ignored.'}, 'floor.tileh': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Floor tiles: the other side of a tile, in millimetres (with floor.tilew).'}, 'floor.tilew': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Floor tiles: one side of a tile, in millimetres, for a count of tiles (with floor.tileh). Optional; the boxes are still counted by area.'}, 'loft.target': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Chosen target insulation depth in millimetres.'}, 'paper.match': {'enum': ['free', 'straight', 'half-drop'], 'type': 'string', 'description': 'How the pattern lines up.'}, 'paper.paste': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Rolls one packet of paste does.'}, 'paper.price': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Accepted and ignored: this interface uses no prices.'}, 'paper.width': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Roll width in centimetres.'}, 'board.finish': {'enum': ['skim', 'joint', 'unsure'], 'type': 'string', 'description': 'How the boards will be finished.'}, 'board.fixing': {'enum': ['screws', 'adhesive', 'unsure'], 'type': 'string', 'description': 'How the boards will be fixed.'}, 'board.layers': {'anyOf': [{'type': 'integer'}, {'type': 'string'}], 'description': 'Whole layers from the complete system specification.'}, 'board.length': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Board length in metres.'}, 'carpet.width': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'The fixed width of the carpet roll in metres.'}, 'ceilingpaint': {'enum': ['quick', 'custom'], 'type': 'string', 'description': 'Whether the ceiling paint uses the labelled example figures (quick) or figures read off the tin (custom). Needed for the keys below to take effect.'}, 'paper.length': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Roll length in metres.'}, 'paper.repeat': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Pattern repeat in centimetres. 0 or left out for none.'}, 'loft.existing': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Existing insulation depth in millimetres.'}, 'walltiles.box': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Metres squared in one box. Custom only.'}, 'board.adhesive': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Wall boards one bag of plasterboard adhesive fixes, from its instructions.'}, 'floor.adhesive': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Floor tiles: metres squared one bag of adhesive covers.'}, 'floor.covering': {'enum': ['laminate', 'engineered', 'vinylPlank', 'tile'], 'type': 'string', 'description': 'What the floor is. Default laminate.'}, 'floor.examples': {'type': 'string', 'description': 'Which of extra and packs are still the labelled example figures. Leave it out unless the planner wrote it.'}, 'floor.underlay': {'enum': ['need', 'have', 'not-needed', 'unsure'], 'type': 'string', 'description': 'Whether underlay is needed.'}, 'wallpaint.tins': {'type': 'string', 'description': 'Tin sizes in litres, comma separated, for the wall paint. A size may carry a price after "@": the price is accepted and ignored.'}, 'carpet.underlay': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Metres squared covered by one chosen underlay roll or pack.'}, 'wallpaint.coats': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Coats on the tin, for the wall paint. Custom only.'}, 'wallpaint.extra': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Percent to add for waste and touch-ups, for the wall paint. Custom only.'}, 'walltiles.extra': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Percent to add for cuts.'}, 'walltiles.grout': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Metres squared one bag of grout covers.'}, 'walltiles.price': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Accepted and ignored: this interface uses no prices.'}, 'walltiles.tileh': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'The other side of a wall tile, in millimetres (with walltiles.tilew).'}, 'walltiles.tilew': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'One side of a wall tile, in millimetres, for a count of tiles (with walltiles.tileh). Optional; the boxes are still counted by area.'}, 'carpet.allowance': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'The trimming allowance in metres, added once to each room measurement.'}, 'carpet.direction': {'enum': ['auto', 'length', 'width'], 'type': 'string', 'description': 'Which way the pile or pattern must run. Not decided lets the planner show the smaller one-piece cut that fits.'}, 'lengths.skirting': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Length the skirting is sold in, in metres.'}, 'walltiles.height': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Metres up the wall the tiles go. Left out: to the ceiling.'}, 'ceilingpaint.tins': {'type': 'string', 'description': 'Tin sizes in litres, comma separated, for the ceiling paint. A size may carry a price after "@": the price is accepted and ignored.'}, 'ceilingpaint.coats': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Coats on the tin, for the ceiling paint. Custom only.'}, 'ceilingpaint.extra': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Percent to add for waste and touch-ups, for the ceiling paint. Custom only.'}, 'lengths.architrave': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Length the architrave is sold in, in metres.'}, 'wallpaint.coverage': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Metres squared covered by one litre in one coat, from the tin, for the wall paint. Custom only.'}, 'wallpaint.examples': {'type': 'string', 'description': 'Which of coats, coverage, extra and tins are still the labelled example figures. Leave it out unless the planner wrote it.'}, 'walltiles.adhesive': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Metres squared one bag of adhesive covers.'}, 'floor.underlay.roll': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Metres squared in one roll of underlay.'}, 'floor.underlay.price': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Accepted and ignored: this interface uses no prices.'}, 'ceilingpaint.coverage': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Metres squared covered by one litre in one coat, from the tin, for the ceiling paint. Custom only.'}, 'ceilingpaint.examples': {'type': 'string', 'description': 'Which of coats, coverage, extra and tins are still the labelled example figures. Leave it out unless the planner wrote it.'}, 'lengths.skirting.price': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Accepted and ignored: this interface uses no prices.'}, 'lengths.architrave.price': {'anyOf': [{'type': 'number'}, {'type': 'string'}], 'description': 'Accepted and ignored: this interface uses no prices.'}}, 'additionalProperties': False}
Ajouté
plan_room
4 October 2026 02:40
Ajouté
ask_questions
4 October 2026 02:40