BuildBatch
UK DIY shopping lists for one room: paint, wallpaper, tiles, flooring and more, in real packs.
我该使用它吗
质量与安全性
B
基于对工具定义和协议合规性的自动分析。
上下文开销
~4,170token 数(工具定义)
~24.9 KB典型响应大小
对注意力有显著影响(占 128k 上下文窗口的 3.26%)
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"buildbatch": {
"url": "https://buildbatch.co.uk/mcp"
}
}
}远程端点
https://buildbatch.co.uk/mcpstreamable-http它能做什么
工具清单
工具(2)
🟢 只读🟡 写入🔴 删除⚪ 未知
🟢ask_questions
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.
输入模式
{
"type": "object",
"additionalProperties": false
}🟢plan_room(v, job, units, length, width, ...)
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.
输入模式
{
"type": "object",
"properties": {
"v": {
"anyOf": [
{
"type": "integer"
},
{
"type": "string"
}
],
"description": "The version of the format. 1. Left out, 1 is assumed and the answer says so.",
"enum": [
"1"
]
},
"job": {
"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.",
"enum": [
"paint",
"wallpaper",
"tiles",
"flooring",
"carpet",
"loft",
"both",
"paint-carpet",
"skirting",
"plasterboard",
"concrete"
]
},
"units": {
"type": "string",
"description": "What length, width, height and the doors are measured in. Default m. In ft write 13ft9in, or 13 for whole feet.",
"enum": [
"m",
"cm",
"mm",
"ft"
]
},
"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."
},
"width": {
"type": "string",
"description": "The other side of the floor, in the units. Not needed when plan is given."
},
"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, concrete or skirting alone."
},
"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."
},
"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."
},
"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."
},
"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."
},
"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."
},
"walls": {
"type": "string",
"description": "What the walls get. The job sets it, so it is rarely needed: paint, wallpaper, tiles, board or none.",
"enum": [
"paint",
"wallpaper",
"tiles",
"board",
"none"
]
},
"ceiling": {
"type": "string",
"description": "What the ceiling gets: paint, board or none.",
"enum": [
"paint",
"board",
"none"
]
},
"trim": {
"type": "string",
"description": "New skirting, architrave or both, with any job. Default skirting for the skirting job, else none.",
"enum": [
"skirting",
"architrave",
"skirting,architrave",
"none"
]
},
"surface": {
"type": "string",
"description": "What the painted surfaces are like now. Default sound, the planner's own default. Used by painting jobs.",
"enum": [
"sound",
"new-bare",
"stained",
"damp-mould",
"flaking-glossy",
"other"
]
},
"subfloor": {
"type": "string",
"description": "What is under a new floor. Default unsure. Used by flooring jobs.",
"enum": [
"timber",
"concrete",
"existing",
"unsure"
]
},
"ground": {
"type": "string",
"description": "Whether the floor is on the ground floor. Default unsure. Used by flooring jobs.",
"enum": [
"yes",
"no",
"unsure"
]
},
"fitting": {
"type": "string",
"description": "How the floor is fitted. Default unsure. Used by flooring jobs.",
"enum": [
"click",
"glue",
"nail",
"unsure"
]
},
"wallpaint": {
"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.",
"enum": [
"quick",
"custom"
]
},
"wallpaint.coats": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Coats on the tin, for the wall paint. Custom only."
},
"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.extra": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Percent to add for waste and touch-ups, for the wall paint. Custom only."
},
"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."
},
"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."
},
"ceilingpaint": {
"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.",
"enum": [
"quick",
"custom"
]
},
"ceilingpaint.coats": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Coats on the tin, for the ceiling paint. Custom only."
},
"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.extra": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Percent to add for waste and touch-ups, for the ceiling paint. Custom only."
},
"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.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."
},
"floor": {
"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.",
"enum": [
"quick",
"custom"
]
},
"floor.covering": {
"type": "string",
"description": "What the floor is. Default laminate.",
"enum": [
"laminate",
"engineered",
"vinylPlank",
"tile"
]
},
"floor.extra": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Percent to add for cuts. Custom only."
},
"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.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": {
"type": "string",
"description": "Whether underlay is needed.",
"enum": [
"need",
"have",
"not-needed",
"unsure"
]
},
"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."
},
"floor.adhesive": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Floor tiles: metres squared one bag of adhesive covers."
},
"floor.grout": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Floor tiles: metres squared one bag of grout covers."
},
"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."
},
"floor.tileh": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Floor tiles: the other side of a tile, in millimetres (with floor.tilew)."
},
"carpet": {
"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.",
"enum": [
"quick",
"custom"
]
},
"carpet.width": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "The fixed width of the carpet roll in metres."
},
"carpet.allowance": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "The trimming allowance in metres, added once to each room measurement."
},
"carpet.step": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "The step in metres in which the shop sells the cut length."
},
"carpet.underlay": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Metres squared covered by one chosen underlay roll or pack."
},
"carpet.direction": {
"type": "string",
"description": "Which way the pile or pattern must run. Not decided lets the planner show the smaller one-piece cut that fits.",
"enum": [
"auto",
"length",
"width"
]
},
"carpet.covering": {
"type": "string",
"description": "What is laid from the roll: carpet (with underlay and gripper) or sheet vinyl (loose laid, taped or glued; no underlay). Sheet vinyl is sold in 2, 3 and 4 m widths; its quick example is a 3 m roll.",
"enum": [
"carpet",
"vinyl"
]
},
"loft": {
"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.",
"enum": [
"quick",
"custom"
]
},
"loft.existing": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Existing insulation depth in millimetres."
},
"loft.target": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Chosen target insulation depth in millimetres."
},
"loft.depth": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Thickness of one new mineral-wool layer in millimetres, from the chosen roll."
},
"loft.pack": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Square metres covered by one chosen roll or pack."
},
"loft.extra": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Percent to add for cuts and fitting."
},
"concrete": {
"type": "string",
"description": "Whether the concrete slab uses labelled example figures (quick) or the thickness decided for the job and figures read off the bag (custom). Needed for the keys below to take effect. The room is the slab: its length and width, no height.",
"enum": [
"quick",
"custom"
]
},
"concrete.thickness": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Slab thickness in millimetres, decided for the job. BuildBatch suggests none."
},
"concrete.extra": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Percent to add for an uneven base and spillage."
},
"concrete.supply": {
"type": "string",
"description": "Bags of dry mix, or ready-mixed concrete delivered by the cubic metre.",
"enum": [
"bags",
"mixed"
]
},
"concrete.yield": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Cubic metres one bag makes, as printed on the bag. Bags only."
},
"concrete.weight": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "The weight of one bag in kilograms. Bags only."
},
"concrete.step": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "The step in cubic metres the supplier sells ready-mixed concrete in. Ready-mixed only; optional."
},
"paper": {
"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.",
"enum": [
"quick",
"custom"
]
},
"paper.width": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Roll width in centimetres."
},
"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."
},
"paper.match": {
"type": "string",
"description": "How the pattern lines up.",
"enum": [
"free",
"straight",
"half-drop"
]
},
"paper.price": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Accepted and ignored: this interface uses no prices."
},
"paper.paste": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Rolls one packet of paste does."
},
"walltiles": {
"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.",
"enum": [
"quick",
"custom"
]
},
"walltiles.height": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Metres up the wall the tiles go. Left out: to the ceiling."
},
"walltiles.box": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Metres squared in one box. Custom only."
},
"walltiles.extra": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Percent to add for cuts."
},
"walltiles.price": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Accepted and ignored: this interface uses no prices."
},
"walltiles.adhesive": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Metres squared one bag of adhesive covers."
},
"walltiles.grout": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Metres squared one bag of grout covers."
},
"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."
},
"walltiles.tileh": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "The other side of a wall tile, in millimetres (with walltiles.tilew)."
},
"lengths": {
"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.",
"enum": [
"quick",
"custom"
]
},
"lengths.skirting": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Length the skirting is sold in, in metres."
},
"lengths.skirting.price": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Accepted and ignored: this interface uses no prices."
},
"lengths.architrave": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Length the architrave is sold in, in metres."
},
"lengths.architrave.price": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Accepted and ignored: this interface uses no prices."
},
"board": {
"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.",
"enum": [
"quick",
"custom"
]
},
"board.width": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Board width in metres."
},
"board.length": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Board length in metres."
},
"board.layers": {
"anyOf": [
{
"type": "integer"
},
{
"type": "string"
}
],
"description": "Whole layers from the complete system specification."
},
"board.extra": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Percent to add for cuts."
},
"board.finish": {
"type": "string",
"description": "How the boards will be finished.",
"enum": [
"skim",
"joint",
"unsure"
]
},
"board.skim": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Metres squared one bag of finish plaster covers, from the bag."
},
"board.fixing": {
"type": "string",
"description": "How the boards will be fixed.",
"enum": [
"screws",
"adhesive",
"unsure"
]
},
"board.adhesive": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Wall boards one bag of plasterboard adhesive fixes, from its instructions."
},
"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."
},
"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."
},
"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."
},
"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."
},
"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."
},
"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."
}
},
"required": [
"job"
],
"additionalProperties": false
}社区
证据
最近观测
已验证未记录版本2 个工具