About OpenMEP duct sizing
OpenMEP duct sizing is an MCP server for agents and HVAC engineers that sizes duct sections and grades existing ones using fixed equal-friction or Manual D rates. It accepts airflow as an input and returns preliminary results for engineering review.
Key features
- 01Size individual duct sections
- 02Analyze connected duct networks
- 03Apply Manual D friction rates
- 04Grade existing ducts
- 05Flag network and sizing issues
Use cases
- 01Choose duct sizes from design airflow
- 02Review existing duct dimensions
- 03Check a network against fan static pressure
MCP support
Exposes `size_duct` and `size_duct_network` tools to MCP clients. The tools are read-only and return sizing recommendations, grades, and findings.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
2Saved tool list · updated 2w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| cfm | number | Yes | Airflow the run carries, CFM. |
| role | enum | No | main (at equipment), branch (serves several terminals), or runout (one terminal). Default main.main | branch | runout |
| existing | any | No | Existing section to grade: { diameterIn } for round, or { shape: rect|oval, widthIn, heightIn }. |
| airflowType | enum | No | System, which sets the velocity cap. Default supply.supply | return | exhaust | outside-air |
Details
From the project README@openmep/mcp
An MCP server that gives any agent OpenMEP's deterministic HVAC duct sizing. No editor, CAD host, account, or network access: the agent describes the ducts, the engine sizes them.
{
"mcpServers": {
"openmep": { "command": "npx", "args": ["-y", "-p", "@openmep/mcp", "openmep-mcp"] }
}
}
Claude Code: claude mcp add openmep -- npx -y -p @openmep/mcp openmep-mcp.
Requires Node.js 24+. Transport: stdio.
Tools
| Tool | Input | Returns |
|---|---|---|
size_duct | cfm, optional role (main/branch/runout), airflowType (supply/return/exhaust/outside-air), existing section ({diameterIn} or {shape: rect|oval, widthIn, heightIn}) | Recommended standard round diameter, velocity, friction; for an existing section its circular equivalent and ok/undersized/oversized |
size_duct_network | items: terminals with requiredCfm, segments (optionally with existing and lengthFt), fittings (optionally equivalentLengthFt), equipment, linked by connectedItemRefs; optional fan (externalStaticInWg, componentLossesInWg) | Every loaded segment's CFM, role, recommendation, and grade; with fan, the Manual D design (available static, total effective length, friction rate, governing paths); findings for missing CFM, disconnected terminals, dangling references, mixed systems, undersized and oversized runs, friction rate outside 0.06–0.18 |
Both tools are read-only and idempotent. Invalid input comes back as a tool
error naming the field (NetworkInputError [invalid-item]: items[2].requiredCfm: ...)
so the model can correct it.
Example prompt that works in a fresh Claude Code session with only this server:
I have a furnace feeding a supply trunk that tees into two runouts: bedroom 1 needs 120 CFM, bedroom 2 needs 90 CFM, and the living room is fed off the trunk end at 200 CFM. All drawn as 6 inch round. One return grille in the hall at 410 CFM on a 10 inch drop. Is anything undersized?
The agent builds the network in one size_duct_network call and reports 7, 6,
and 8 in runouts, an 11 in trunk, and a return drop just under size at 10 in.
Engineering basis and limits
Equal friction at 0.08 in. w.g./100 ft, or at the Manual D rate derived from the blower's
available static pressure when fan and lengths are given, with role-based velocity caps per system,
rounded up to standard round diameters; see
@openmep/hvac-domain for the formula,
sources, and what is excluded (fitting losses, static pressure summation, fan
selection). Airflow is a design input the server never estimates. Treat results
as preliminary sizing for an engineer to review.
The server uses the official MCP TypeScript SDK and speaks the
initialize-handshake protocol revisions (through 2025-11-25), which current
clients support.
Library
import { createOpenMepServer } from "@openmep/mcp";
await createOpenMepServer().connect(transport); // any MCP server transport
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.