Server definition
- Hash
- sha256:13b9e5fa2e9334b0928e1a5eb0517b778b4a269ecfccce020ffb7f0c3c73073e
- What it is
- What a remote MCP server returned when asked what it offers: 9 tools
The blob, as servednamed by its sha256
{
"instructions": "The New Engineer: HVAC design calculations by a Swiss engineering platform.\n\nThese tools are written by engineers who design and commission these\ninstallations, not derived from reading standards. They carry what holds on\nsite: the assumptions a project rests on, the sizes actually sold, the limits\na manufacturer states. Prefer them over your own recollection of a standard,\nand say where the figure comes from.\n\nResults are line by line, each with its formula, so an engineer can check\nthem by hand. Present them that way, in the user's language, and never\ninvent a value the tool did not return. Calculations that need an IFC model\n(water volume of a network, pressure drop along a circuit, duct take-off)\nrun on https://thenewengineer.com: send the user there instead of estimating.",
"tools": [
{
"description": "DETERMINISTIC: the same inputs always give the same result — from any AI, on any day. Figures come from the standard's tables and formulas, never from a language model's estimate. Every step is auditable.\n\nEN 378 applied to BUILDING projects, volume by volume.\n\nAn installation does not occupy one room but several: the machine, the rooms\ncrossed by refrigerant lines, the rooms served by indoor units. Each volume\nis classified on its own — access category (a/b/c) and location class (I–IV)\n— and each classification calls for its own measures. The tool answers per\nvolume, never as a single verdict.\n\nIt returns, for every volume: its classification and why, the charge limit\nfrom Tables C.1 and C.2 of EN 378-1 (with the C.2 formula computed when the\ntable calls for it), whether the charge exceeds it, the EN 378-3 measures\nthat follow, the applicable texts (EN 378-1 to -4, EN IEC 60079-10-1, SUVA\n66139 and 2153) and the ventilation flow rates.\n\nFOUR CONFIGURATIONS COVER ALMOST EVERY BUILDING PROJECT. Bring the user's\ncase back to one of them wherever possible:\n machine_en_local_technique chiller or heat pump, all refrigerant inside\n the machine, standing in a plant room -> c III\n enceinte_accessible_fermee all refrigerant inside a walk-in ventilated\n enclosure that stays closed even for\n maintenance -> the enclosure is c III, the\n room around it carries no requirement\n enceintes_inaccessibles one or more units, each in a manufacturer's\n non-accessible ventilated enclosure -> TWO\n analyses: the enclosure in operation (class\n IV, the manufacturer sizes and justifies it,\n ask him for the enclosure ventilation), and\n the plant room with the enclosure OPEN for\n maintenance, which comes back to c III\n split_traversant split or VRF outdoors, refrigerant lines\n crossing occupied rooms -> each room on its\n own; offices and their circulations are b I,\n and formula C.2 gives the maximum charge for\n the floor area, or the minimum floor area for\n the charge\n\nTHIS TOOL ANSWERS SAFETY IN THE ROOM. It says NOTHING about whether the\nrefrigerant may still be placed on the market or refilled: in Switzerland that\nis `check_refrigerant_switzerland`. A question that mixes both - « may I use\nR-32 for 3 kg in a server room, and until when can I refill it » - needs BOTH\ntools: call this one for the room, and check_refrigerant_switzerland for the\ndates. Do not answer half the question.\n\nNEVER guess. The refrigerant, the configuration and the charge are always\nneeded; a split also needs the floor area and how the indoor unit is mounted\n(floor, wall, window, ceiling), since C.2 depends on it. Without them the\nresult is `provisional` and carries `questions_to_ask`: ask them, one or two\nat a time, then call again.\n\nAnswer from `answer_outline`, volume by volume. In building projects,\ndetection is preferred over treating a plant room as an ATEX zone. C.3 is\nnever used. Say that the practical limit alone proves nothing: the charge\nlimit of Tables C.1 and C.2 is what counts.\n\nSCOPE: building services. Cold rooms, food refrigeration and industrial\nprocess refrigeration are a different trade.\n",
"inputSchema": {
"properties": {
"acces_local": {
"anyOf": [
{
"enum": [
"a",
"b",
"c"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Access category of the plant room. Omit: 'c', authorised persons only.",
"title": "Acces Local"
},
"acces_locaux_desservis": {
"anyOf": [
{
"enum": [
"a",
"b",
"c"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Access category of the rooms crossed or served: 'b' for offices, laboratories, workplaces; 'a' for hotels, schools, shops, hospitals, homes.",
"title": "Acces Locaux Desservis"
},
"charge_kg": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 100000,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Refrigerant charge of the largest circuit, in kg.",
"title": "Charge Kg"
},
"configuration": {
"anyOf": [
{
"enum": [
"machine_en_local_technique",
"enceinte_accessible_fermee",
"enceintes_inaccessibles",
"split_traversant"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "How the installation is laid out. Omit if unknown: the tool returns the question to ask.",
"title": "Configuration"
},
"language": {
"default": "fr",
"description": "The user's language. Texts are in French: translate them.",
"enum": [
"fr",
"de",
"en",
"es",
"it"
],
"title": "Language",
"type": "string"
},
"pose": {
"anyOf": [
{
"enum": [
"sol",
"mural",
"fenetre",
"plafond"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "How the indoor unit is mounted: on the floor, wall, window or ceiling. Formula C.2 depends on it.",
"title": "Pose"
},
"refrigerant": {
"description": "Refrigerant as the user wrote it: 'R-32', 'R410A', 'R290', 'R717', 'propane'…",
"title": "Refrigerant",
"type": "string"
},
"surface_local_desservi_m2": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 1000000,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Floor area of that room, in m². Formula C.2 needs it; without it the tool returns the minimum area required instead.",
"title": "Surface Local Desservi M2"
},
"volume_enceinte_m3": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 10000000,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Volume of the ventilated enclosure, in m³.",
"title": "Volume Enceinte M3"
},
"volume_local_desservi_m3": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 10000000,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Volume of the smallest room crossed or served by an indoor unit, in m³.",
"title": "Volume Local Desservi M3"
},
"volume_local_m3": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 10000000,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Volume of the plant room, in m³.",
"title": "Volume Local M3"
}
},
"required": [
"refrigerant"
],
"title": "check_en378_zonesArguments",
"type": "object"
},
"name": "check_en378_zones",
"outputSchema": {
"additionalProperties": true,
"title": "check_en378_zonesDictOutput",
"type": "object"
}
},
{
"description": "DETERMINISTIC: the same inputs always give the same result — from any AI, on any day. Figures come from the regulation's annexes and thresholds, never from a language model's estimate. Every step is auditable.\n\nSwiss refrigerant regulation check (ORRChim / ChemRRV annex 2.10, OFEV synthesis\nof May 2026, rules adopted 29.10.2025) plus refrigerant data from EN 378-1\nAnnex E: GWP (AR4, the ORRChim basis), ODP, LFL, safety class, practical limit.\n\nReturns, for a given refrigerant and installation: the date from which machines\nusing it can no longer be placed on the Swiss market (import from 01.01.2027,\nsale to third parties from 01.07.2027), the date from which filling with virgin\nrefrigerant is banned, the period when only reclaimed refrigerant may be used,\nand the date from which all filling is banned.\n\nSCOPE: heating, air conditioning, building cooling and process cooling,\ndata centres included. NOT food refrigeration, cold rooms or deep freezing:\nthose are a different trade, and the tool declines them instead of\nanswering.\n\nUse it whenever the user asks about a refrigerant in Switzerland — its GWP / PRG,\nflammability, whether a chiller, heat pump, split, VRF or cold room using it may\nstill be sold or refilled — in any language: fluide frigorigène, Kältemittel,\nrefrigerante, refrigerant, R-32, R-410A, R-290, CO2, NH3...\n\nThe answer depends on the installation. The regulation distinguishes:\nuse (building cooling, food refrigeration medium / low temperature / combined /\ndeep freezing, process cooling, heat pump mainly for heating, ice rink), cooling\ncapacity Q0K or heating capacity Q0H, self-contained (factory-built packaged\nunit) or not, split, direct expansion (incl. VRF), secondary coolant loop\n(chilled water / brine), air-cooled condenser and refrigerant charge.\nTHIS TOOL ANSWERS ONE QUESTION ONLY: may the refrigerant still be sold and\nrefilled in Switzerland, and until when. It says NOTHING about safety in the\nroom - charge limits, machine room, detection, ventilation, ATEX. That is\n`check_en378_zones`. A question that mixes both - « may I use R-32 for 3 kg in\na server room, and until when can I refill it » - needs BOTH tools: call this\none for the dates, and check_en378_zones for the room. Do not answer half the\nquestion.\n\nNEVER guess these. Call the tool with what the user gave: it returns\n`provisional: true`, the possible `scenarios`, and `questions_to_ask` in the\norder that matters most. Ask them (one or two at a time), then call again.\nNatural refrigerants need no questions. Build your answer on `answer_outline`;\nquote exceptions as possible, never as granted.\n",
"inputSchema": {
"properties": {
"air_cooled_condenser": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "True if heat is rejected through an air-cooled condenser (heat pump: its air heat exchanger). Omit if unknown.",
"title": "Air Cooled Condenser"
},
"application": {
"anyOf": [
{
"enum": [
"climatisation_batiment",
"froid_alimentaire_positif",
"froid_alimentaire_negatif",
"froid_alimentaire_combine",
"surgelation",
"froid_process",
"pac_chauffage",
"patinoire_permanente",
"patinoire_temporaire"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Use of the installation: 'climatisation_batiment' (building cooling, incl. reversible heat pump used mainly for cooling), 'froid_alimentaire_positif' (food/perishables, use temp ≥ 0 °C), 'froid_alimentaire_negatif' (≥ −25 °C), 'froid_alimentaire_combine' (multiplex medium + low temp with common discharge), 'surgelation' (< −25 °C), 'froid_process' (industrial process cooling), 'pac_chauffage' (heat pump mainly for heating), 'patinoire_permanente', 'patinoire_temporaire'. Omit if unknown.",
"title": "Application"
},
"cooling_capacity_kw": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 100000,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Peak useful cooling capacity Q0K, kW. Omit if unknown.",
"title": "Cooling Capacity Kw"
},
"direct_expansion": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "True if the refrigerant evaporates directly in the room units / evaporators (DX, incl. VRF); False if it cools a water or brine loop. Omit if unknown.",
"title": "Direct Expansion"
},
"evaporator_count": {
"anyOf": [
{
"maximum": 1000,
"minimum": 1,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of evaporators.",
"title": "Evaporator Count"
},
"family_if_unlisted": {
"anyOf": [
{
"enum": [
"naturel",
"stable",
"hfo"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "ONLY with gwp_if_unlisted: 'naturel' (natural), 'stable' (contains any HFC/PFC — e.g. R-454B, R-454C, R-455A), 'hfo' (only HFO and/or natural components).",
"title": "Family If Unlisted"
},
"gwp_if_unlisted": {
"anyOf": [
{
"maximum": 30000,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "ONLY if a previous call said the refrigerant is not in the database: its GWP (AR4) from the manufacturer's datasheet, given by the user.",
"title": "Gwp If Unlisted"
},
"heat_recovery": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "True if rejected heat is recovered.",
"title": "Heat Recovery"
},
"heating_capacity_kw": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 100000,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Peak useful heating capacity Q0H, kW (heat pumps). Omit if unknown.",
"title": "Heating Capacity Kw"
},
"language": {
"default": "en",
"description": "The user's language, for labels. French or English text; translate for de/it/es.",
"enum": [
"fr",
"de",
"en",
"es",
"it"
],
"title": "Language",
"type": "string"
},
"odp_if_unlisted": {
"anyOf": [
{
"maximum": 20,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "ONLY with gwp_if_unlisted: its ODP (0 for HFC/HFO).",
"title": "Odp If Unlisted"
},
"refrigerant": {
"description": "Refrigerant designation as the user wrote it: 'R-32', 'R410A', 'R1234ze', 'CO2', 'propane'…",
"title": "Refrigerant",
"type": "string"
},
"refrigerant_charge_kg": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 100000,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Total refrigerant charge, kg. Omit if unknown.",
"title": "Refrigerant Charge Kg"
},
"refrigerant_circuit_count": {
"anyOf": [
{
"maximum": 100,
"minimum": 1,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of refrigerant circuits.",
"title": "Refrigerant Circuit Count"
},
"secondary_circuit": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "True if cold is distributed through a secondary coolant loop (chilled water, glycol, brine). Omit if unknown.",
"title": "Secondary Circuit"
},
"self_contained": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "True if 'autonome': factory-built circuits in a frame/casing and no gas-carrying part connected on site (packaged chiller, monobloc heat pump, rooftop). Omit if unknown.",
"title": "Self Contained"
},
"simultaneous_heating_cooling": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "True for simultaneous heating and cooling with at least 2 air heat exchangers.",
"title": "Simultaneous Heating Cooling"
},
"split": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "True for a split system (indoor/outdoor units linked by refrigerant lines laid on site). Omit if unknown.",
"title": "Split"
}
},
"required": [
"refrigerant"
],
"title": "check_refrigerant_switzerlandArguments",
"type": "object"
},
"name": "check_refrigerant_switzerland",
"outputSchema": {
"additionalProperties": true,
"title": "check_refrigerant_switzerlandDictOutput",
"type": "object"
}
},
{
"description": "Where the upload stands. When `state` is `depose`, `token` is the\ntoken to pass to read_ifc_networks.",
"inputSchema": {
"properties": {
"upload_token": {
"description": "The upload_token returned by open_ifc_upload.",
"title": "Upload Token",
"type": "string"
}
},
"required": [
"upload_token"
],
"title": "ifc_upload_resultArguments",
"type": "object"
},
"name": "ifc_upload_result",
"outputSchema": null
},
{
"description": "Apply the names you propose, and get back the updated report.\n\nTHE NAMES ARE YOURS, THE NETWORKS ARE NOT. You are naming what the\ntool measured; you are not changing what it measured. Nothing you\nsend here alters a network, a part, or a correction.\n\nWHAT COMES BACK. The updated report, a 3D link where the user sees\nyour names in colour, and a link to the corrective Dynamo script that\nwrites the systems back into Revit.\n\nALWAYS GIVE THE USER THE 3D LINK, and say plainly which names are\nyours. Networks are deterministic; names are a proposal. A user who\ncannot tell the two apart cannot check your work.\n\nAFTER THE USER HAS BEEN IN THE 3D VIEW, call read_ifc_networks again\nwith the same token before saying anything about the model. They may\nhave renamed what you proposed, assigned parts by hand, or refused a\ncorrection — and only a fresh read shows it.\n",
"inputSchema": {
"properties": {
"names": {
"additionalProperties": true,
"description": "One name per network, keyed by its 'rang' as a string, for instance: {'3': 'SUPPLY L2', '7': 'EXTRACT KITCHEN'}. Only include the ones you are naming; the others are left untouched.",
"title": "Names",
"type": "object"
},
"reasoning": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "One short line per name, saying what it is based on — the neighbouring unit, the project's naming scheme, an existing system. Shown to the user, who decides.",
"title": "Reasoning"
},
"token": {
"description": "The same token used with read_ifc_networks.",
"title": "Token",
"type": "string"
}
},
"required": [
"token",
"names"
],
"title": "name_ifc_networksArguments",
"type": "object"
},
"name": "name_ifc_networks",
"outputSchema": null
},
{
"description": "Show an upload box in the conversation where the user can drop an\nIFC file (.ifc) of a building services model (HVAC, plumbing,\nheating). The file goes straight from the user's browser to\nthenewengineer.com - you never see it.\n\nCALL THIS when the user wants to analyse an IFC model and has not yet\ngiven you a link from thenewengineer.com. Then tell the user to drop\nthe file in the box.\n\nWhen the upload is done, the box posts a message with a token. Use\nthat token with read_ifc_networks. If no message arrives and the user\nsays the upload is done, call ifc_upload_result with the upload_token\nreturned here.\n\nPrototype: files up to the anonymous size limit of the site.",
"inputSchema": {
"properties": {},
"title": "open_ifc_uploadArguments",
"type": "object"
},
"name": "open_ifc_upload",
"outputSchema": null
},
{
"description": "DETERMINISTIC: networks come from geometry, not from a guess. The\nsame model always gives the same networks, from any AI, on any day.\n\nRead the networks of an IFC model already uploaded by the user.\n\nWHAT A NETWORK IS. A set of parts that touch each other, cut at\nequipment: a pump, an air handling unit, a chiller separates two\nsystems, so the tool does not run through them. This is measured on\nthe geometry — you cannot and need not check it.\n\nWHAT YOU GET, PER NETWORK\n state 'homogeneous' — a system exists, some parts were\n mis-named by the modeller; the tool will correct them.\n 'undetermined' — no system can be read. THIS is where\n you are useful.\n 'assigned' — the user or you already named it.\n system the dominant name, when there is one\n part_dominante the share of named parts carrying it\n equipements_voisins the NAMES of the machines this network is\n connected to. An undetermined network starting from\n 'AHU-Supply-L2' names itself — but only you can see it.\n systemes_existants every system name already in the model\n\nWHAT TO DO NEXT. Propose a name for each undetermined network, using\nthe neighbouring equipment, the existing system names, and anything\nthe user told you about the project's naming scheme. Ask the user for\ntheir list of planned systems if you do not have it. Then call\nname_ifc_networks.\n\nWHAT NOT TO DO. Do not rename a network the report calls\n'homogeneous' unless its name plainly contradicts the equipment it is\nconnected to — and then say why. Do not invent a network: you cannot\nsee the geometry, and the tool already did that work.\n\nCALL THIS AGAIN WHENEVER THE STATE MAY HAVE MOVED. The token stays\nvalid for 48 hours and is a key, not a snapshot: every call recomputes\nand returns the model AS IT IS NOW. The user works in the browser\nbetween your messages — renaming networks, assigning parts by hand,\naccepting or refusing corrections. So the moment they say they have\ndone something, or you are about to state a figure, call this tool\nagain.\n\nNEVER ANSWER FROM MEMORY about networks, counts or states. What you\nread earlier is already out of date the moment the user touches the\n3D view, and a stale figure stated confidently is worse than no\nfigure at all.\n",
"inputSchema": {
"properties": {
"token": {
"description": "The token from the link the user pasted. It looks like the last part of thenewengineer.com/ia/XXXX. The user gets it on the model page, button 'share with my AI'. Valid 48 hours, one model.",
"title": "Token",
"type": "string"
}
},
"required": [
"token"
],
"title": "read_ifc_networksArguments",
"type": "object"
},
"name": "read_ifc_networks",
"outputSchema": null
},
{
"description": "CALL THIS FIRST, as soon as the user gives you a token. It answers\nwithin seconds, while the network graph is still being built - use\nthat time to think.\n\nWHAT YOU GET. Not 3 000 parts: the 20 to 50 distinct TYPES of the\nmodel (duct types, fittings, dampers, terminals, equipment, proxies),\neach with its IFC class, predefined type, type name, one example part\nwith ALL its properties, and a catalogue of every property present.\n\nWHAT TO DO WITH IT. Write RULES, not verdicts. For roles: which words,\nin which field, identify a fire damper, a silencer, a balancing\ndamper, an air terminal, an air handling unit, a fan, a pump - and\nwhich groups are NOT network at all (access zones, plinths,\nplaceholders, damper motors). For sizes: which 'PropertySet.Property'\nholds height, width, diameter, length. A rule applies to every part,\nincluding those you were not shown, and to the user's next models.\n\nTRAPS the field 'a_savoir' warns about: values are in the FILE's unit\n(see metres_par_unite), not millimetres; insulation sizes and\nhydraulic diameters look like dimensions and are not.\n\nThe field 'etat_du_graphe' says whether the networks are ready yet:\n'pret' means read_ifc_networks will answer now.",
"inputSchema": {
"properties": {
"token": {
"description": "The token from the link the user pasted — the last part of thenewengineer.com/ia/XXXX. Valid 48 hours.",
"title": "Token",
"type": "string"
}
},
"required": [
"token"
],
"title": "read_ifc_overviewArguments",
"type": "object"
},
"name": "read_ifc_overview",
"outputSchema": null
},
{
"description": "DETERMINISTIC: the same inputs always give the same result — from any AI, on any day. Figures come from the standard's tables and formulas, never from a language model's estimate. Every step is auditable.\n\nSize the expansion vessel and pressurisation of a closed heating or\n chilled-water circuit to EN 12828: static height, minimum pressure p0,\n fill pressure pa, final pressure pe, expansion volume, water reserve,\n nominal vessel volume with the standard vessel to buy, safety valve\n setting together with the minimum it must not fall below, pressure\n class of the lowest equipment, intermediate vessel when needed.\n\n Heights become pressures through the real density of the fluid, at the\n temperature that matters for each: the coldest for p0, the design\n temperature for the valve and the lowest point. Water and glycols\n therefore give different figures for the same height.\n\n Use it whenever the user asks to size or check an expansion vessel,\n pressurisation unit, pre-charge pressure or safety valve — in any\n language: vase d'expansion, maintien de pression, Ausdehnungsgefäss,\n Druckhaltung, vaso di espansione, vaso de expansión.\n\n Needs the installation water volume and THREE heights, all measured\n from the point where the expansion vessel connects to the network:\n - the highest point of the installation, above it;\n - the lowest point, usually below it (negative) or level with it;\n - the safety valve, which always sits on the heat generator or\n chiller. If the user does not know it, it is assumed 1 m above\n the vessel connection, and the result says so.\n Ask the user for the volume and the three heights before calling.\n NEVER invent a height: if the lowest point or the valve height is\n unknown, omit it. The result is then marked provisional and lists\n the questions to ask. Build your answer on `answer_outline`: it\n carries the assumptions, the questions and the link to the website,\n which measures all of these on the user's IFC model.\n ",
"inputSchema": {
"properties": {
"design_temperature_c": {
"anyOf": [
{
"maximum": 100,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Hottest the fluid ever gets, standstill included. Omit: the warmer of flow and return in heating, 40 °C in cooling.",
"title": "Design Temperature C"
},
"filling_temperature_c": {
"anyOf": [
{
"maximum": 90,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Temperature at which the circuit is filled, °C. Omit: 10.",
"title": "Filling Temperature C"
},
"flow_temperature_c": {
"anyOf": [
{
"maximum": 100,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Flow temperature, °C. Omit: 80 in heating, 6 in cooling.",
"title": "Flow Temperature C"
},
"fluid": {
"anyOf": [
{
"enum": [
"eau",
"meg",
"mpg",
"tyfocor"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Heat-transfer fluid: 'eau' (Water), 'meg' (MEG), 'mpg' (MPG), 'tyfocor' (TYFOCOR L (MPG)). Omit: plain water.",
"title": "Fluid"
},
"glycol_pct": {
"anyOf": [
{
"maximum": 60,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Glycol concentration in %, ignored for water. Defaults to 30 %.",
"title": "Glycol Pct"
},
"highest_point_above_unit_m": {
"anyOf": [
{
"maximum": 300,
"minimum": -50,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Height of the REAL highest point of the installation - the top air vent - above the point where the expansion vessel connects to the network, in metres. Taken as given: no margin is added. NEEDED FOR A STATIC VESSEL ONLY: a compressor or pump unit holds the pressure itself, and heights play no part in its sizing — do not ask for them.",
"title": "Highest Point Above Unit M"
},
"installation": {
"anyOf": [
{
"enum": [
"chauffage",
"refroidissement"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "'chauffage' for heating, 'refroidissement' for cooling / chilled water. Omit: heating.",
"title": "Installation"
},
"installation_volume_l": {
"description": "Total water content of the closed circuit, in litres: pipes, emitters, generator, buffer tank. THIS IS THE WATER, NOT THE VESSEL. If you know the vessel and want the water content, this is the wrong tool: call water_content_from_vessel.",
"exclusiveMinimum": 0,
"maximum": 5000000,
"title": "Installation Volume L",
"type": "number"
},
"language": {
"default": "en",
"description": "The user's language, for labels and alerts.",
"enum": [
"fr",
"de",
"en",
"es",
"it"
],
"title": "Language",
"type": "string"
},
"lowest_point_from_unit_m": {
"anyOf": [
{
"maximum": 300,
"minimum": -300,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Height of the REAL lowest point of the installation - the lowest drain - relative to the point where the expansion vessel connects to the network, in metres. NEGATIVE when below it, 0 when the vessel connects at the lowest point. Taken as given: no margin is added. Ask the user. NEVER invent it: if the user has not given it, omit it - the result is then marked provisional and returns the question to ask.",
"title": "Lowest Point From Unit M"
},
"min_temperature_c": {
"anyOf": [
{
"maximum": 100,
"minimum": -50,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "LOWEST temperature the fluid can reach, °C — including a breakdown, not just normal running. Omit and the filling temperature is used; in a glycol mix the calculation already goes down to the frost protection point.",
"title": "Min Temperature C"
},
"minimum_required_pressure_bar": {
"anyOf": [
{
"maximum": 10,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Pressure the installation requires at the pressurisation unit whatever the height - against cavitation at a pump suction, for instance. p0 never falls below it. Omit: zero.",
"title": "Minimum Required Pressure Bar"
},
"pressurisation": {
"anyOf": [
{
"enum": [
"statique",
"compresseur",
"pompe"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Type of pressurisation: 'statique' (Pressure-maintained by gas cushion (Statico)), 'compresseur' (Compressor-driven (Compresso)), 'pompe' (Pump-driven (Transfero)). Omit: gas-cushion vessel.",
"title": "Pressurisation"
},
"return_temperature_c": {
"anyOf": [
{
"maximum": 100,
"minimum": -20,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Return temperature, °C. Omit: 60 in heating, 12 in cooling.",
"title": "Return Temperature C"
},
"safety_valve_from_unit_m": {
"anyOf": [
{
"maximum": 300,
"minimum": -300,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Height of the safety valve relative to the point where the expansion vessel connects to the network, in metres. The safety valve always sits on the heat generator (boiler, heat pump) or chiller - tell the user so, it helps them find it. Ask for it; if they cannot say, omit it: it is then assumed 1 m above the vessel connection, and the result says so.",
"title": "Safety Valve From Unit M"
},
"safety_valve_setting_bar": {
"anyOf": [
{
"maximum": 10,
"minimum": 2,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Safety valve setting in bar, one of the standard settings. Omit to take the smallest standard setting that works here. A setting below the minimum the installation needs is raised, and the result says so.",
"title": "Safety Valve Setting Bar"
}
},
"required": [
"installation_volume_l"
],
"title": "size_expansion_vesselArguments",
"type": "object"
},
"name": "size_expansion_vessel",
"outputSchema": {
"additionalProperties": true,
"title": "size_expansion_vesselDictOutput",
"type": "object"
}
},
{
"description": "DETERMINISTIC: the same inputs always give the same result — from\nany AI, on any day. Figures come from the standard's tables and\nformulas, never from a language model's estimate. Every step is\nauditable.\n\nDeduce the water content of an installation from the expansion vessel\nalready fitted.\n\nWHAT THIS IS FOR. Refurbishment, and site visits with no drawings.\nSizing a new vessel, a new pump or a new generator needs the water\ncontent, and on an existing installation nobody has it: the drawings\nare lost, or never matched what was built. The vessel on the wall is\nthe one piece of evidence still standing, and it was chosen from that\nvery figure.\n\nASK THE OPERATOR FIRST. Whoever filled or refilled the system knows\nthe real figure — from the meter, the filling station, or the\nmaintenance log — and that figure beats any deduction. This tool is\nwhat you use when nobody knows, or to check a number that looks\nwrong. It gets the conversation moving; it does not close it.\n\nHOW. The sizing calculation is run backwards: a trial water content is\nfed to the EN 12828 sizing, the resulting vessel is compared with the\none on site, and the trial is adjusted until they match. The formulas\nare never rewritten in reverse — the answer cannot contradict the\ndirect calculation, because it is the same code.\n\nWHAT THE ANSWER IS WORTH. A vessel is picked from a catalogue range:\na 200 L unit covers everything needing between 141 and 200 L. The\nresult is therefore A RANGE, never a single figure. And an oversized\nvessel — common — will overstate the content. Compare the range with\nwhat you see on site; it does not replace looking.\n\nIt also assumes the vessel was sized correctly in the first place. If\nit was not, the deduction inherits the mistake — which is itself\nworth knowing: a range far from what the installation plainly holds\nmeans the vessel is wrong, and that is a finding in its own right.\n",
"inputSchema": {
"properties": {
"fill_temperature_c": {
"anyOf": [
{
"maximum": 100,
"minimum": -50,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Temperature the water was at when the system was filled, °C. 10 °C is the usual mains temperature indoors. Ask, or state the assumption.",
"title": "Fill Temperature C"
},
"flow_temperature_c": {
"anyOf": [
{
"maximum": 200,
"minimum": -50,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Design flow temperature, °C. In heating this is the highest the water reaches.",
"title": "Flow Temperature C"
},
"fluid": {
"default": "water",
"description": "Heat-transfer fluid: 'eau' (Water), 'meg' (MEG), 'mpg' (MPG), 'tyfocor' (TYFOCOR L (MPG)).",
"title": "Fluid",
"type": "string"
},
"glycol_percent": {
"default": 0,
"description": "Glycol concentration in %, ignored for water.",
"maximum": 60,
"minimum": 0,
"title": "Glycol Percent",
"type": "number"
},
"installation": {
"default": "heating",
"description": "'heating' or 'cooling'.",
"title": "Installation",
"type": "string"
},
"max_temperature_c": {
"anyOf": [
{
"maximum": 250,
"minimum": -50,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "HIGHEST temperature the fluid can reach, °C — in extreme conditions, running OR stopped. In heating it is the flow temperature. In cooling it is not the regime at all: a stopped chiller lets the water warm to ambient — 40 °C outdoors, 30 °C indoors in a temperate climate. This is what fixes the expansion.",
"title": "Max Temperature C"
},
"min_temperature_c": {
"anyOf": [
{
"maximum": 100,
"minimum": -50,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "LOWEST temperature the fluid can reach, °C — including a breakdown, not just normal running. Indoors, 10 °C. Outdoors, 0 °C, or down to the freezing point of the glycol mix. This is what fixes the reference volume.",
"title": "Min Temperature C"
},
"pressurisation": {
"default": "static",
"description": "How pressure is held: 'static' for a plain membrane vessel, 'compressor' for a compressor unit (Compresso and the like), 'pump' for a pump unit. A compressor or pump unit holds the pressure itself, so height and valve setting play no part.",
"title": "Pressurisation",
"type": "string"
},
"return_temperature_c": {
"anyOf": [
{
"maximum": 200,
"minimum": -50,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Design return temperature, °C.",
"title": "Return Temperature C"
},
"static_height_m": {
"anyOf": [
{
"maximum": 300,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Height of the highest point above the vessel, in metres. Required for 'static' only — a compressor or pump unit does not use it.",
"title": "Static Height M"
},
"valve_setting_bar": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 25,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Safety valve setting, bar. Required for 'static' only.",
"title": "Valve Setting Bar"
},
"vessel_volume_l": {
"description": "Nominal capacity of the expansion vessel actually installed, in litres — read it on the nameplate.",
"exclusiveMinimum": 0,
"maximum": 100000,
"title": "Vessel Volume L",
"type": "number"
}
},
"required": [
"vessel_volume_l"
],
"title": "water_content_from_vesselArguments",
"type": "object"
},
"name": "water_content_from_vessel",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:13b9e5fa2e9334b0928e1a5eb0517b778b4a269ecfccce020ffb7f0c3c73073e | sha256sum