OpenMEP duct sizing

io.github.samarmstrongPublished by GitHub account samarmstrongv0.2.0Updated Oct 24, 2026

Deterministic HVAC duct sizing at a fixed or Manual D friction rate; grades existing ducts.

VerifiedSTDIODesktop onlyDeveloper ToolsData & Analytics

Overview

AI-generated overview

A local MCP server that lets an assistant size HVAC ducts deterministically at a fixed or Manual D friction rate and grade existing duct sections.

What you can do
Size a single duct from CFM, role, airflow type and an optional existing round, rectangular or oval section, returning a recommended standard round diameter, velocity, friction and an ok/undersized/oversized grade for existing ducts. Size a whole duct network of terminals, segments, fittings and equipment linked by references, returning per-segment CFM, role, recommendation and grade. With fan static pressure and lengths, derive the Manual D design: available static, total effective length, friction rate and governing paths. Report findings such as missing CFM, disconnected terminals, dangling references, mixed systems, undersized or oversized runs and friction rates outside 0.06–0.18. Both
When to use it
Useful when an assistant needs preliminary HVAC duct sizing or a check of whether existing ducts are undersized, oversized or adequate, including whole-network layouts with a blower's static pressure. Results are meant as preliminary sizing for an engineer to review.
Requirements
Runs locally over stdio via npx from the npm package @openmep/mcp; requires Node.js 24+. No editor, CAD host, account, API key or network access is needed.
Before you install
Airflow is a design input the server never estimates, so the assistant must supply CFM values. The engine excludes fitting losses, static pressure summation and fan selection, and results are preliminary sizing for an engineer to review. Both tools are read-only and idempotent, so nothing is written or sent.

Installation

In SourceWeft

  1. Open OpenMEP duct sizing in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

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.

json
{  "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

ToolInputReturns
size_ductcfm, 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_networkitems: 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

ts
import { createOpenMepServer } from "@openmep/mcp";await createOpenMepServer().connect(transport); // any MCP server transport

Source: packages/mcp/README.md at commit 4f57471

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

2
  1. v0.2.0LatestOct 7, 2026
  2. v0.1.0Sep 23, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts