{"version": "0.7.0", "records": [{"title": "Overview", "page": "Overview", "url": "/exam/cli/", "text": "Start using VentilatePro in ChatGPT, run reproducible HVAC calculations, review saved project results, or integrate the CLI and MCP server.", "group": "Start here"}, {"title": "Start with your engineering task", "url": "/exam/cli/#start-here", "text": "Start with your engineering task VentilatePro connects HVAC calculations and project records across the web app, ChatGPT, the command line, and other AI clients. Choose the workflow you need. 01 Use VentilatePro in ChatGPT Connect the sidebar workspace, run calculators, and discuss results. \u2192 02 Run an HVAC calculation Find formulas, units, worked examples, and calculation limits. \u2192 03 Review saved project results Read room, zone, and AHU schedules with calculation freshness. \u2192 04 Connect the CLI or an AI agent Install the command-line tool or configure an MCP client. \u2192", "page": "Overview", "group": "Start here"}, {"title": "Choose an interface", "url": "/exam/cli/#choose-interface", "text": "Choose an interface Interface Best for Account ChatGPT workspace Six calculators, saved project results, engineering prompts VentilatePro OAuth connection Browser calculator Psychrometrics, charts, exports No login CLI Repeatable offline calculations and project automation No login for local calculators; token for project work General MCP server Typed tools for AI agents and guarded project workflows OAuth remotely; token for local project tools The ChatGPT workspace reads saved project values. Its six calculators and read permissions are a focused subset of the general MCP server.", "page": "Overview", "group": "Start here"}, {"title": "Try a calculation", "url": "/exam/cli/#first-calculation", "text": "Try a calculation Open the free browser psychrometric calculator , or install the CLI for a repeatable sensible-load check: pipx install ventilatepro-cli\nventilatepro calc sensible-load --cfm 5000 --entering-dry-bulb 80 --leaving-dry-bulb 55 --json Expected result: 135,000 Btu/h of sensible cooling, using 1.08 \u00d7 5,000 \u00d7 (80 \u2212 55). This uses standard-density air. It is a sensible-load check; whole-building loads require the project calculation workflow. See air-load formulas and assumptions or the installation guide .", "page": "Overview", "group": "Start here"}, {"title": "Continue with a focused guide", "url": "/exam/cli/#quickstart", "text": "Continue with a focused guide CLI installation and upgrades Token presets and project access Command reference Structured JSON output and scripting Authentication and guarded writes AI integrations and engineering workflows Markdown documentation for AI agents", "page": "Overview", "group": "Start here"}, {"title": "Use in ChatGPT", "page": "Use in ChatGPT", "url": "/exam/cli/chatgpt/", "text": "Connect the VentilatePro ChatGPT sidebar workspace, run six HVAC calculators, use engineering prompts, and review saved room, zone and AHU results.", "group": "Start here"}, {"title": "Connect the workspace", "url": "/exam/cli/chatgpt/#connect", "text": "Connect the workspace You need a VentilatePro account and a ChatGPT account that permits custom plugins. ChatGPT controls availability through account and workspace settings. Enable Developer mode in ChatGPT settings, then open Plugins \u2192 + . Name the connection VentilatePro , choose Server URL , and enter: https://ventilatepro.com/mcp/workspace Choose OAuth . Sign in to VentilatePro and approve project, entity, and calculation read access. Install the plugin from your personal Plugins directory. Open VentilatePro in the sidebar, or select it in a Work chat and ask \u201cOpen VentilatePro.\u201d The sidebar workspace uses /mcp/workspace . For an agent that needs the wider tool catalog, follow general MCP setup instead. Menus can change. See OpenAI's connection instructions for current availability.", "page": "Use in ChatGPT", "group": "Start here"}, {"title": "Use the Home, Calculators, and Results tabs", "url": "/exam/cli/chatgpt/#workspace", "text": "Use the Home, Calculators, and Results tabs Home: browse engineering examples and documentation. Start chat opens and sends an example in a new conversation on supported web and desktop hosts. Mobile and hosts without this capability use Ask in this chat . Calculators: enter inputs, review their units, run a calculation, and inspect its basis. Results: choose an accessible project, then review saved rooms, zones, or AHUs. Discuss in ChatGPT: share the displayed inputs and results with the conversation for interpretation. Choose Open calculator or View results on a Home example to go straight to its workspace view.", "page": "Use in ChatGPT", "group": "Start here"}, {"title": "Try the six calculators", "url": "/exam/cli/chatgpt/#calculator-prompts", "text": "Try the six calculators Copy a prompt below into a conversation with VentilatePro selected, or use its matching example on the plugin Home tab. These examples use IP units. Psychrometrics Use VentilatePro to calculate air properties at 75\u00b0F, 50% relative humidity, and sea level. Report dew point, humidity ratio, enthalpy, and units. Explain the pressure assumption and condensation risk. Inputs: 75\u00b0F dry bulb, 50% RH, sea-level standard pressure. The dew point is approximately 55.1\u00b0F. Surfaces colder than the dew point can condense moisture. Duct sizing Use VentilatePro to size a duct for 1,200 CFM at 800 FPM with a 2:1 rectangular aspect ratio. Show the area, round diameter, and rectangular dimensions. Expected area: 1.50 ft\u00b2. The round diameter is approximately 16.6 in. The rectangular dimensions are approximately 20.8 \u00d7 10.4 in. This is a velocity sizing check; review friction, fittings, and standard fabrication sizes separately. Sensible load Use VentilatePro to calculate sensible cooling load for 1,200 CFM entering at 75\u00b0F and leaving at 55\u00b0F, using 1.08. Show the formula, Btu/h, and refrigeration tons. Expected result: 25,920 Btu/h, or 2.16 tons, using standard-density air. Positive load represents cooling. Hydronic load Use VentilatePro to calculate hydronic load at 24 GPM and a 10\u00b0F temperature difference, with water at 8.33 lb/gal and specific heat 1 Btu/lb\u00b7\u00b0F. Show the inputs, formula, and units. Expected result: 119,952 Btu/h, or approximately 10.00 tons. Use project-specific fluid density and specific heat for glycol. Fan power Use VentilatePro to calculate fan power at 5,000 CFM and 2 inches water gauge, with fan efficiency 0.65 and motor efficiency 0.90. Distinguish shaft power from electrical input power. Expected shaft power: approximately 2.42 hp. Electrical input: approximately 2.01 kW. Enter efficiencies as fractions. Pump power Use VentilatePro to calculate pump power at 100 GPM and 60 feet of head, with pump efficiency 0.70, motor efficiency 0.90, and specific gravity 1. Explain the power values and units. Expected shaft power: approximately 2.16 hp. Electrical input: approximately 1.79 kW. Specify total head in feet of the pumped fluid. See the calculator reference for formulas, validation, units, and the additional CLI/MCP calculators.", "page": "Use in ChatGPT", "group": "Start here"}, {"title": "Review projects and compare operating points", "url": "/exam/cli/chatgpt/#project-prompts", "text": "Review projects and compare operating points Use VentilatePro to help me choose a project and show its saved room, zone, and AHU results. Flag stale or blocked calculations and include units. Use VentilatePro to review my selected project's room airflow schedule. Include room IDs, names, saved supply and outdoor-air values, units, and calculation status. Use VentilatePro to review saved zone airflows and calculation status for my selected project. Identify stale or blocked results and preserve the returned units. Use VentilatePro to review my selected project's saved AHU airflow, coil loads, and calculation status. Include record IDs and units. Use VentilatePro to compare fan input power at 5,000 CFM and 2 versus 3 inches water gauge, holding fan efficiency at 0.65 and motor efficiency at 0.90. Show both calculations and explain what the comparison assumes. Use VentilatePro to prepare a read-only engineering review of my selected project's saved room, zone, and AHU results. Summarize missing inputs, stale or blocked calculations, and unresolved design questions with record IDs and units. Read the project results guide for interpreting saved values and calculation freshness.", "page": "Use in ChatGPT", "group": "Start here"}, {"title": "Understand the workspace limits", "url": "/exam/cli/chatgpt/#limits", "text": "Understand the workspace limits The workspace reads saved values. Update inputs and recalculate in VentilatePro, then refresh Results. It does not modify projects or run simulations. A saved result or a successful tool response does not by itself confirm that a design is complete. Use the wider MCP integration for supported project editing and guarded automation. Its scopes and tools differ from the sidebar workspace.", "page": "Use in ChatGPT", "group": "Start here"}, {"title": "Resolve common connection issues", "url": "/exam/cli/chatgpt/#connection-help", "text": "Resolve common connection issues Symptom Next step No developer mode or plugin option Check ChatGPT account availability and workspace policy. No interactive workspace Verify the full /mcp/workspace endpoint and reopen the installed plugin. Project is missing Check the VentilatePro account used for OAuth and its project membership. Expired or revoked connection Reconnect through OAuth and review the requested read scopes. Results are stale Recalculate in VentilatePro and refresh the plugin Results view. See troubleshooting or contact support .", "page": "Use in ChatGPT", "group": "Start here"}, {"title": "Review project results", "page": "Review project results", "url": "/exam/cli/projects/", "text": "Find accessible projects and review saved room, zone and AHU airflow, load and calculation status with units and freshness checks.", "group": "Engineering"}, {"title": "Choose an accessible project", "url": "/exam/cli/projects/#find-project", "text": "Choose an accessible project In the ChatGPT workspace, open Results and choose a project. The list follows the signed-in VentilatePro account's project access. A project's name is a label; use the returned ID when referring to a particular record. Use VentilatePro to list the projects I can access. Let me choose one, then show its saved calculation status with the project ID. For terminal work, authenticate with a suitable read token and list projects: ventilatepro projects list\nventilatepro calc status --project 123 --json Replace example project ID 123 with an ID returned by your project list.", "page": "Review project results", "group": "Engineering"}, {"title": "Read room, zone, and AHU results", "url": "/exam/cli/projects/#schedules", "text": "Read room, zone, and AHU results View Review Useful question Rooms Record IDs, names, saved supply and outdoor air, and status Which rooms have missing inputs or stale airflow results? Zones Saved zone airflow and load values, units, and calculation status Which zones need recalculation before comparing totals? AHUs Saved system airflow, coil loads, and status Which AHU results are blocked or incomplete? Keep the returned units and scope with each value. Missing values are not zero. Fetch all pages when reviewing an entire schedule, and avoid adding unlike quantities or combining totals from overlapping scopes. ventilatepro rooms list --project 123\nventilatepro zones list --project 123\nventilatepro ahus list --project 123", "page": "Review project results", "group": "Engineering"}, {"title": "Check freshness before interpreting a result", "url": "/exam/cli/projects/#freshness", "text": "Check freshness before interpreting a result Saved values describe the last completed calculation. Inputs can change afterward. Check the returned calculation status before using a value for a design decision. Stale: inputs have changed since the saved calculation. Recalculate in VentilatePro and refresh Results. Blocked: a prerequisite or required input prevents calculation. Read the returned reason and resolve it in the project. Missing: the requested result is unavailable. Report the missing value and avoid substituting a guessed result. The plugin does not edit project inputs or run recalculation. Use the web app or an authorized general MCP workflow for those operations.", "page": "Review project results", "group": "Engineering"}, {"title": "Prepare an engineering review", "url": "/exam/cli/projects/#review-summary", "text": "Prepare an engineering review Use VentilatePro to review my selected project's saved room, zone, and AHU results. Include IDs, inputs and units where available, calculation freshness, missing values, blocked calculations, and questions requiring engineering judgment. Keep the review read-only. A useful review identifies the project and records, describes the source and units, distinguishes saved values from new calculations, and lists unresolved questions. Record assumptions explicitly. Confirm final design requirements and equipment selections against the project's standards and manufacturer data.", "page": "Review project results", "group": "Engineering"}, {"title": "HVAC calculators", "page": "HVAC calculators", "url": "/exam/cli/calculations/", "text": "Calculate psychrometrics, air loads, hydronic flow, steam, fan and pump power, duct dimensions, and LMTD with formulas, units, and CLI examples.", "group": "Engineering"}, {"title": "Run an HVAC calculation without logging in", "url": "/exam/cli/calculations/#calculation-quickstart", "text": "Run an HVAC calculation without logging in Calculation commands execute locally. They do not send project data to VentilatePro, do not require a token, and return the same structured result when called from the CLI or the local MCP server. Add --json for automation, test fixtures, spreadsheets, or agent workflows. ventilatepro calc catalog ventilatepro calc psychrometrics --dry-bulb 25 --relative-humidity 50 --units si --json Engineering sign convention Airside load commands report positive values for cooling or dehumidification and negative values for heating or humidification. Hydronic load follows the sign of delta_t . Use absolute values only when equipment capacity\u2014not heat-flow direction\u2014is the required result.", "page": "HVAC calculators", "group": "Engineering"}, {"title": "Calculation catalog", "url": "/exam/cli/calculations/#calculation-catalog", "text": "Calculation catalog Command Primary output Calculation basis calc psychrometrics Complete moist-air state PsychroLib 2.5.0, IP or SI calc sensible-load Btu/h and refrigeration tons Q = 1.08 \u00d7 CFM \u00d7 \u0394T , coefficient overridable calc total-load Btu/h and refrigeration tons Q = 4.5 \u00d7 CFM \u00d7 \u0394h , coefficient overridable calc air-process Sensible, latent, total, SHR, mass flow, water removal PsychroLib endpoint states and entering-air specific volume calc hydronic-load Btu/h and refrigeration tons Q = 60 \u00d7 GPM \u00d7 \u03c1 \u00d7 c\u209a \u00d7 \u0394T calc hydronic-flow Required GPM Inverse hydronic energy balance calc steam Saturated properties and required lb/h IAPWS-IF97 water and steam formulation calc fan-power Shaft hp, input hp, input kW hp = CFM \u00d7 in. w.g. / (6356 \u00d7 \u03b7) calc pump-power Shaft hp, input hp, input kW hp = GPM \u00d7 head \u00d7 SG / (3960 \u00d7 \u03b7) calc duct-size Area, round diameter, rectangular sides Continuity at target velocity calc lmtd Terminal differences and LMTD Parallel-flow or counterflow logarithmic mean", "page": "HVAC calculators", "group": "Engineering"}, {"title": "Psychrometrics", "url": "/exam/cli/calculations/#psychrometrics", "text": "Psychrometrics Supply dry-bulb temperature plus exactly one independent moisture property: relative humidity, wet bulb, dew point, or humidity ratio. When pressure is omitted, VentilatePro evaluates PsychroLib\u2019s standard-atmosphere station pressure at the supplied elevation. Explicit pressure always overrides elevation. IP example ventilatepro calc psychrometrics --dry-bulb 75 --relative-humidity 50 Temperature is \u00b0F, pressure is psi, elevation is ft, enthalpy is Btu/lb dry air, and specific volume is ft\u00b3/lb dry air. Humidity ratio is also returned in grains/lb. SI example ventilatepro calc psychrometrics --dry-bulb 25 --relative-humidity 50 --units si --json Temperature is \u00b0C, pressure is Pa, elevation is m, enthalpy is J/kg dry air, and specific volume is m\u00b3/kg dry air. Returned properties Dry bulb, wet bulb, dew point, relative humidity, humidity ratio, grains per pound in IP, moist-air enthalpy, dry-air-basis specific volume, moist-air density, vapor pressure, degree of saturation, and station pressure. The JSON response also identifies the input pair, unit system, property units, and calculation basis.", "page": "HVAC calculators", "group": "Engineering"}, {"title": "Sensible, total, and complete air-process loads", "url": "/exam/cli/calculations/#air-loads", "text": "Sensible, total, and complete air-process loads Sensible load ventilatepro calc sensible-load --cfm 5000 --entering-dry-bulb 80 --leaving-dry-bulb 55 The default 1.08 coefficient represents standard-density air and typical moist-air specific heat. Override it when project elevation, density, or calculation standards require a different coefficient. Total load from enthalpy ventilatepro calc total-load --cfm 5000 --entering-enthalpy 31.2 --leaving-enthalpy 22.8 The default 4.5 lb dry air/h per CFM factor is the conventional standard-air approximation. Use air-process when altitude-adjusted mass flow is important. Altitude-adjusted air process ventilatepro calc air-process --cfm 5000 --entering-dry-bulb 80 --entering-rh 50 --leaving-dry-bulb 55 --leaving-rh 95 --json VentilatePro calculates both endpoint states with PsychroLib, converts CFM to dry-air mass flow using entering specific volume, evaluates total load from enthalpy difference, evaluates sensible load with moist-air specific heat at average humidity ratio, and reports latent load as the reconciled balance. Water removal is based on dry-air mass flow times humidity-ratio reduction.", "page": "HVAC calculators", "group": "Engineering"}, {"title": "Hydronic and saturated-steam calculations", "url": "/exam/cli/calculations/#water-steam", "text": "Hydronic and saturated-steam calculations Hydronic load and flow ventilatepro calc hydronic-load --gpm 120 --delta-t 10 ventilatepro calc hydronic-flow --load 600000 --delta-t 10 Defaults are water at 8.33 lb/gal and 1.0 Btu/lb\u00b7\u00b0F. Supply project-specific density and specific heat for glycol or other fluids. Saturated steam ventilatepro calc steam --pressure 15 --pressure-units psig --load 1000000 --json Pressure may be psig, psia, kPa, or MPa. Results include saturation temperature, saturated-liquid and saturated-vapor specific volumes, h_f , h_fg , h_g , quality, mixture enthalpy, and optional required steam mass flow. Gauge pressure uses 14.6959488 psi atmosphere.", "page": "HVAC calculators", "group": "Engineering"}, {"title": "Fan, pump, duct, and heat-exchanger tools", "url": "/exam/cli/calculations/#power-sizing", "text": "Fan, pump, duct, and heat-exchanger tools Fan input power ventilatepro calc fan-power --cfm 20000 --static-pressure 4 --fan-efficiency 0.68 --motor-efficiency 0.92 Pump input power ventilatepro calc pump-power --gpm 500 --head 60 --pump-efficiency 0.75 --motor-efficiency 0.90 Duct geometry ventilatepro calc duct-size --cfm 2400 --velocity 1200 --aspect-ratio 2 Log-mean temperature difference ventilatepro calc lmtd --hot-in 200 --hot-out 150 --cold-in 80 --cold-out 120 --arrangement counterflow Efficiencies are decimal fractions from 0 to 1. Duct results are geometric starting points and do not replace friction-rate, noise, fitting-loss, leakage, or constructability checks. LMTD validates both terminal temperature differences and rejects temperature cross.", "page": "HVAC calculators", "group": "Engineering"}, {"title": "The same calculations for AI agents", "url": "/exam/cli/calculations/#calculation-mcp", "text": "The same calculations for AI agents The local MCP server exposes explicit tools with typed arguments and structured results. These tools remain offline and unauthenticated even when the project-management tools require a VentilatePro token. MCP tool Purpose vp_list_hvac_calculations Discover the local calculation catalog. vp_calculate_psychrometrics Resolve a complete IP or SI moist-air state. vp_calculate_sensible_load Conventional sensible air load. vp_calculate_total_load Conventional total air load from enthalpy. vp_calculate_air_process Altitude-adjusted PsychroLib air-process balance. vp_calculate_hydronic Load from GPM or GPM from load. vp_calculate_steam IAPWS saturated properties and steam rate. vp_calculate_fan_power , vp_calculate_pump_power Shaft and input power. vp_calculate_duct_size , vp_calculate_lmtd Distribution geometry and heat-exchanger temperature difference.", "page": "HVAC calculators", "group": "Engineering"}, {"title": "References, accuracy, and limits", "url": "/exam/cli/calculations/#calculation-references", "text": "References, accuracy, and limits Psychrometric calculations use PsychroLib 2.5.0 in its selected IP or SI unit system. PsychroLib documents its equations and coefficients as implementations of ASHRAE Handbook\u2014Fundamentals psychrometric relationships. Steam properties use the IAPWS-IF97 formulation through CoolProp 8.0.0's IF97 backend. Saturation requests are limited to the water triple-point and critical pressures. The CLI serializes every result with its calculation name, values, units or input basis, formulas where applicable, and sign convention. Hard validation failures return a non-zero exit code. Downloaded VentilatePro charts sample saturation at 0.25\u00b0F and other property families at 0.5\u00b0F, solve enthalpy/saturation intersections numerically, clip curves to the physically valid region, and preserve vector paths in the PDF. These tools are engineering calculation aids. Verify final design values, safety factors, code requirements, equipment selections, fluid properties, and manufacturer data for the project. Downloaded psychrometric charts Browser psychrometric charts preserve vector paths in PDF exports. Keep the station pressure, unit system, and source inputs with the report. The altitude worked example explains how pressure changes humidity ratio and specific volume. Machine-readable documentation AI crawlers and retrieval systems can discover the concise documentation index at /llms.txt and the full Markdown corpus at /llms-full.txt . Both endpoints are public, indexable, linked from every documentation page, and included in robots.txt .", "page": "HVAC calculators", "group": "Engineering"}, {"title": "Install the CLI", "page": "Install the CLI", "url": "/exam/cli/install/", "text": "Install VentilatePro CLI with pipx, run your first offline calculation, authenticate for project work, and choose suitable token scopes.", "group": "Integrations"}, {"title": "Get from zero to a working CLI session in five steps", "url": "/exam/cli/install/#quickstart", "text": "Get from zero to a working CLI session in five steps The CLI is distributed through PyPI as ventilatepro-cli . It uses the VentilatePro web app for token issuance, then talks only to the stable /api/cli/ surface. Install the CLI Use pipx on workstations when possible. It keeps the tool isolated and makes upgrades predictable. pipx install ventilatepro-cli pipx upgrade ventilatepro-cli Create a CLI token in VentilatePro Open Account Settings, choose the preset that matches your workflow, create the token, and copy the raw token immediately. The raw secret is shown once. Create a CLI token Token presets Log in from the terminal The CLI validates the token before saving it. Use the default flow if you want the hidden prompt, or pipe the token from stdin for scripted setups. ventilatepro auth login Get-Clipboard | ventilatepro auth login --token-stdin Confirm the session and discover a project Check that the stored token resolves to the expected user, then list accessible projects and capture the project ID you want to work with. ventilatepro auth whoami ventilatepro projects list Run the first useful command From here you can inspect project data, model room equipment, run supported calculations, capture notes, or connect an MCP agent depending on the token preset you created. ventilatepro rooms list --project 123 ventilatepro room-equipment summary --project 123 ventilatepro calc status --project 123 ventilatepro mcp doctor", "page": "Install the CLI", "group": "Integrations"}, {"title": "Preferred install paths", "url": "/exam/cli/install/#installation", "text": "Preferred install paths Use case Command Notes Recommended workstation install pipx install ventilatepro-cli Isolated CLI install with straightforward upgrades. Version-pinned install pipx install ventilatepro-cli==0.7.0 Useful for repeatable onboarding or internal docs. Upgrade existing install pipx upgrade ventilatepro-cli Pulls the newest published version from PyPI. Fallback if pipx is unavailable python -m pip install ventilatepro-cli Use inside a virtual environment instead of the global interpreter.", "page": "Install the CLI", "group": "Integrations"}, {"title": "Choose the smallest preset that matches the job", "url": "/exam/cli/install/#token-presets", "text": "Choose the smallest preset that matches the job VentilatePro issues CLI tokens from the web UI. The preset determines which command families work from the terminal. Existing note tokens are not silently upgraded. Preset Use it for Enabled command families notes-only Field capture, note review, and sync. projects discovery plus notes . assistant-read-calc Shell use and external AI tooling that needs read access plus approved calculation endpoints. projects , rooms , zones , ahus , plants , systems , calc , and design-day . editor Human-operated model editing from the terminal. Read, calculations, notes, entity writes, imports, schedules, and controls. agent-editor Codex, Claude, and other local MCP agents that need guarded full-workflow access. Editor capabilities plus QC, notifications, exports, team lookup, and MCP confirmation guardrails.", "page": "Install the CLI", "group": "Integrations"}, {"title": "Authentication", "page": "Authentication", "url": "/exam/cli/auth/", "text": "Set up scoped VentilatePro tokens, verify project access, understand keyring and file storage, and revoke credentials for CLI and MCP workflows.", "group": "Integrations"}, {"title": "Token lifecycle", "url": "/exam/cli/auth/#section-token-lifecycle", "text": "Token lifecycle Create the token in the web UI Open VentilatePro Account Settings and create a CLI token. The raw token is shown once, so copy it immediately. Log in from your machine ventilatepro auth login ventilatepro auth login --token-prompt-visible Get-Clipboard | ventilatepro auth login --token-stdin Verify the token The CLI validates credentials through the authenticated identity endpoint before saving them. ventilatepro auth whoami", "page": "Authentication", "group": "Integrations"}, {"title": "Token presets", "url": "/exam/cli/auth/#section-token-presets", "text": "Token presets Create a separate token for each workstation or agent host, and choose the smallest preset that supports the intended workflow. Preset Best for Access model notes-only Field and coordination notes Project discovery plus note read/create/update. assistant-read-calc Read-oriented tools Entities, systems, calculations, and design-day reads/runs. editor Human terminal editing Read/calc plus entity, import, schedule, control, and note writes. agent-editor Local MCP agents Guarded full-workflow access including QC, notifications, exports, and team lookup.", "page": "Authentication", "group": "Integrations"}, {"title": "Auth commands", "url": "/exam/cli/auth/#section-auth-commands", "text": "Auth commands Status ventilatepro auth status ventilatepro auth status --json Identity ventilatepro auth whoami Logout ventilatepro auth logout Local storage Base URL and non-secret settings are stored in the OS config directory. Tokens are stored in the OS keyring when a supported backend is available. If keyring is unavailable, the token falls back to plaintext in config.json . Protect that directory with OS permissions and exclude it from shared folders, backups available to others, and source control. `auth logout` deletes only local credentials; it does not revoke the server token.", "page": "Authentication", "group": "Integrations"}, {"title": "Local storage", "url": "/exam/cli/auth/#section-local-storage", "text": "Auth commands Status ventilatepro auth status ventilatepro auth status --json Identity ventilatepro auth whoami Logout ventilatepro auth logout Local storage Base URL and non-secret settings are stored in the OS config directory. Tokens are stored in the OS keyring when a supported backend is available. If keyring is unavailable, the token falls back to plaintext in config.json . Protect that directory with OS permissions and exclude it from shared folders, backups available to others, and source control. `auth logout` deletes only local credentials; it does not revoke the server token.", "page": "Authentication", "group": "Integrations"}, {"title": "Windows terminals", "url": "/exam/cli/auth/#section-windows-terminals", "text": "Windows terminals The default login prompt hides input, so pasted characters do not appear on screen. Prefer the hidden prompt or --token-stdin . The fallback --token-prompt-visible displays the secret on screen; do not use it in a recorded or shared terminal. Avoid --token in interactive shells because command history and process inspection can expose it. For copy-paste workflows, pipe the token from stdin with --token-stdin . PowerShell example: Get-Clipboard | ventilatepro auth login --token-stdin", "page": "Authentication", "group": "Integrations"}, {"title": "Security model", "url": "/exam/cli/auth/#section-security-model", "text": "Security model CLI tokens authenticate as bearer tokens in the `Authorization` header. Raw tokens are only shown at creation time in the web UI. Do not place raw tokens in source control, MCP JSON, agent prompts, screenshots, or logs. Tokens never bypass project membership, web-app permissions, validation, or MCP confirmation guardrails. Revocation is managed server-side in VentilatePro Account Settings. Use a new token if an old one is lost or copied to the wrong machine. Open account settings", "page": "Authentication", "group": "Integrations"}, {"title": "Command Reference", "page": "Command Reference", "url": "/exam/cli/commands/", "text": "Use VentilatePro CLI commands for rooms, AHUs, Revit imports, calculations, and notes. Learn JSON output, pagination, and guarded writes.", "group": "Integrations"}, {"title": "What ships in the public CLI today", "url": "/exam/cli/commands/#section-what-ships-in-the-public-cli-today", "text": "What ships in the public CLI today Commands are grouped around the curated /api/cli/ surface. Use text mode for interactive terminal work and --json whenever another tool needs the stable response payload. Family Commands Notes Auth ventilatepro auth login ventilatepro auth status ventilatepro auth whoami ventilatepro auth logout Authenticate once, inspect the current identity, and clear local credentials. Projects ventilatepro projects list ventilatepro projects show 123 Discover accessible projects and inspect project counts and metadata. Rooms ventilatepro rooms list --project 123 ventilatepro rooms show 501 Read room lists and detailed airflow-related room data. Room equipment ventilatepro room-equipment list --project 123 ventilatepro room-equipment summary --project 123 ventilatepro room-equipment create --data '{\"room\": 501, \"name\": \"Sterilizer\", \"heat_gain_value\": 1.8, \"heat_gain_unit\": \"KW\"}' List, summarize, create, update, and explicitly delete equipment assigned to rooms. Revit imports ventilatepro revit-imports review --project 123 --json ventilatepro revit-imports show 41 --project 123 --json ventilatepro revit-imports confirm 41 --project 123 --review-token <token-from-review> --yes ventilatepro revit-imports discard 41 --project 123 --yes Review staged room and zone changes, then confirm the exact unchanged revision with an explicit approval token. Categorization ventilatepro categorization review --project 123 --output room-categorization.json ventilatepro categorization groups --project 123 --output room-groups.json ventilatepro categorization apply --project 123 --input room-categorization.json --yes Prepare deterministic review artifacts and apply confirmed, reasoned, stale-checked room categories. Zones ventilatepro zones list --project 123 ventilatepro zones show 27 Read zone membership, airflow fields, and calculation status. AHUs ventilatepro ahus list --project 123 ventilatepro ahus show 44 Inspect AHU identity, system type, airflow fields, and linked equipment. Plants ventilatepro plants list --project 123 ventilatepro plants show chilled-water:12 Read plant summaries and typed plant detail payloads. Systems ventilatepro systems hierarchy --project 123 ventilatepro systems graph --project 123 --json ventilatepro systems topology --project 123 Return structure for graphing, topology inspection, and downstream tooling. Calc ventilatepro calc catalog ventilatepro calc psychrometrics --dry-bulb 75 --relative-humidity 50 ventilatepro calc air-process --cfm 5000 --entering-dry-bulb 80 --entering-rh 50 --leaving-dry-bulb 55 --leaving-rh 95 --json ventilatepro calc steam --pressure 15 --pressure-units psig --load 1000000 --json ventilatepro calc status --project 123 ventilatepro calc ventilation --ahu 44 ventilatepro calc ahu-steps --ahu 44 --json ventilatepro calc ahu-properties --ahu 44 --procedure summer ventilatepro calc recalculate-airflows --project 123 ventilatepro calc recalculate-stale --project 123 --scope zones --mode sync ventilatepro calc cav --ahu 44 Offline engineering calculators require no login. Project reads and recalculation workflows use the authenticated API. See the calculation reference . Design day ventilatepro design-day context --project 123 ventilatepro design-day run --project 123 --input design-day-request.json ventilatepro design-day results --job 987 Read readiness context, submit jobs, and retrieve results. Notes ventilatepro notes create --project 123 --body \"Captured from terminal\" cat site-walk.md | ventilatepro notes create --project 123 --stdin --tags field,urgent ventilatepro notes list --project 123 ventilatepro notes show note:42 --project 123 ventilatepro notes sync --project 123 Capture CLI notes, search normalized note data, and retry queued note sync. Meetings ventilatepro meetings context --project 123 --json ventilatepro meetings record --project 123 --input meeting.json --json ventilatepro meetings list --project 123 Resolve project members and record minutes, decisions, and assigned tasks atomically. MCP ventilatepro mcp doctor ventilatepro-mcp Validate and launch the local stdio server used by Codex, Claude, and other MCP clients.", "page": "Command Reference", "group": "Integrations"}, {"title": "Core read surface", "url": "/exam/cli/commands/#section-core-read-surface", "text": "Core read surface Projects ventilatepro projects list ventilatepro projects show 123 Entities ventilatepro rooms list --project 123 ventilatepro room-equipment summary --project 123 ventilatepro zones list --project 123 ventilatepro ahus list --project 123 ventilatepro plants list --project 123 Systems ventilatepro systems hierarchy --project 123 ventilatepro systems graph --project 123 --json ventilatepro systems topology --project 123 Guarded workflow commands Calculation commands ventilatepro calc psychrometrics --dry-bulb 75 --relative-humidity 50 ventilatepro calc air-process --cfm 5000 --entering-dry-bulb 80 --entering-rh 50 --leaving-dry-bulb 55 --leaving-rh 95 --json ventilatepro calc steam --pressure 15 --pressure-units psig --load 1000000 --json ventilatepro calc status --project 123 ventilatepro calc ventilation --ahu 44 ventilatepro calc recalculate-airflows --project 123 Design-day commands ventilatepro design-day context --project 123 ventilatepro design-day run --project 123 --input design-day-request.json ventilatepro design-day results --job 987 Notes commands ventilatepro notes create --project 123 --body \"Captured from terminal\" ventilatepro notes list --project 123 ventilatepro notes sync Categorization commands ventilatepro categorization review --project 123 --output room-categorization.json ventilatepro categorization apply --project 123 --input room-categorization.json --yes Revit import commands ventilatepro revit-imports review --project 123 --json ventilatepro revit-imports confirm 41 --project 123 --review-token <token-from-review> --yes Meeting commands ventilatepro meetings context --project 123 --json ventilatepro meetings record --project 123 --input meeting.json --json MCP commands ventilatepro mcp doctor ventilatepro-mcp", "page": "Command Reference", "group": "Integrations"}, {"title": "Guarded workflow commands", "url": "/exam/cli/commands/#section-guarded-workflow-commands", "text": "Core read surface Projects ventilatepro projects list ventilatepro projects show 123 Entities ventilatepro rooms list --project 123 ventilatepro room-equipment summary --project 123 ventilatepro zones list --project 123 ventilatepro ahus list --project 123 ventilatepro plants list --project 123 Systems ventilatepro systems hierarchy --project 123 ventilatepro systems graph --project 123 --json ventilatepro systems topology --project 123 Guarded workflow commands Calculation commands ventilatepro calc psychrometrics --dry-bulb 75 --relative-humidity 50 ventilatepro calc air-process --cfm 5000 --entering-dry-bulb 80 --entering-rh 50 --leaving-dry-bulb 55 --leaving-rh 95 --json ventilatepro calc steam --pressure 15 --pressure-units psig --load 1000000 --json ventilatepro calc status --project 123 ventilatepro calc ventilation --ahu 44 ventilatepro calc recalculate-airflows --project 123 Design-day commands ventilatepro design-day context --project 123 ventilatepro design-day run --project 123 --input design-day-request.json ventilatepro design-day results --job 987 Notes commands ventilatepro notes create --project 123 --body \"Captured from terminal\" ventilatepro notes list --project 123 ventilatepro notes sync Categorization commands ventilatepro categorization review --project 123 --output room-categorization.json ventilatepro categorization apply --project 123 --input room-categorization.json --yes Revit import commands ventilatepro revit-imports review --project 123 --json ventilatepro revit-imports confirm 41 --project 123 --review-token <token-from-review> --yes Meeting commands ventilatepro meetings context --project 123 --json ventilatepro meetings record --project 123 --input meeting.json --json MCP commands ventilatepro mcp doctor ventilatepro-mcp", "page": "Command Reference", "group": "Integrations"}, {"title": "Shared conventions", "url": "/exam/cli/commands/#section-shared-conventions", "text": "Shared conventions Convention Where it shows up Meaning --json Most read commands and note/auth flows Prints the stable response payload directly for machine consumers. --project Project-scoped list, calc, design-day, and notes commands Supplies the project ID that scopes the request. --limit / --offset List commands Pagination over list endpoints that return {count, limit, offset, results} . Typed references notes show , plants show Some detail commands take typed identifiers like note:42 or chilled-water:12 . --type , --source , --tags , --query ventilatepro notes list --project 123 --kind meeting --source cli --tags field,urgent --query terminal Filters the normalized notes list by type, origin, tags, and free text. --data / --input Equipment, categorization, meeting, and other write workflows Accepts inline JSON or a JSON file/stdin payload for repeatable machine workflows. --yes / MCP confirm=true Apply, delete, run, import, export, and other consequential operations Requires explicit caller confirmation before the guarded operation is sent. ventilatepro projects list --json ventilatepro calc status --project 123 --json ventilatepro notes list --project 123 --kind meeting --source cli --tags field,urgent --query terminal", "page": "Command Reference", "group": "Integrations"}, {"title": "Notes list flags", "url": "/exam/cli/commands/#section-notes-list-flags", "text": "Notes list flags Notes keep the richest filter surface in the CLI today because they are the cross-model capture workflow. Use these flags when you need to find exactly the right note in a large project history. Flag Values Behavior --project Project ID Required for note list and note show reads. --limit 1 to 100 Caps the number of notes returned. --offset 0 or greater Skips the first N matching notes. --type note , decision Restricts the list to notes or decisions; --kind narrows notes to meetings, calls, site visits, or agent sessions. --source cli or web Filters by note origin. --tags Comma-separated tags All listed tags must be present on the note. --query Free text Searches note ref, title, body, tags, and metadata fields. --json Flag Returns raw API-shaped JSON instead of human-readable lines. ventilatepro notes list --project 123 --kind meeting --source cli --tags field,urgent --query terminal", "page": "Command Reference", "group": "Integrations"}, {"title": "Write scripts that distinguish results from failures", "url": "/exam/cli/commands/#scripting-contract", "text": "Write scripts that distinguish results from failures Use --help at each command level to discover supported flags. Add --json only where supported. Check the process exit code before parsing results; JSON errors may be written to stdout as {\"error\": \"message\"} , while text errors normally use stderr. Do not infer success from nonempty output. PowerShell example: read project data, stop on failure, then parse JSON. Project IDs in these docs are placeholders; replace them with IDs returned for your account. $projectJson = ventilatepro projects list --limit 20 --offset 0 --json\nif ($LASTEXITCODE -ne 0) { throw \"VentilatePro project lookup failed\" }\n$projectPage = $projectJson | ConvertFrom-Json\n$projectPage.results For paginated lists, retain filters, increment offset by the returned row count, and continue until an empty page or the reported count is reached. A first page is not a complete project audit. Concurrent edits can change list contents; rerun the read if a consistent review is required. Do not automatically retry every write after a timeout. The server may already have accepted it. Read the resulting record or job status first. Reuse the same idempotency key for the same notes or meeting operation; a new key can create another record. Idempotency is supported by specific operations, not every endpoint. notes create can exit successfully after saving to the local queue. Check whether the result is created or queued before reporting that the server has the note. Follow up with notes sync and verify delivery.", "page": "Command Reference", "group": "Integrations"}, {"title": "AI agents and MCP", "page": "AI agents and MCP", "url": "/exam/cli/mcp/", "text": "Connect AI agents to VentilatePro using remote OAuth MCP or local stdio. Explore HVAC calculation tools, project schemas, and guarded Revit workflows.", "group": "Integrations"}, {"title": "VentilatePro in ChatGPT", "url": "/exam/cli/mcp/#chatgpt-workspace", "text": "VentilatePro in ChatGPT Use the sidebar workspace for six HVAC calculators and saved project results. Follow the dedicated ChatGPT setup and prompt guide . Its read-only endpoint is https://ventilatepro.com/mcp/workspace .", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Microsoft Copilot Studio", "url": "/exam/cli/mcp/#copilot-mcp", "text": "Microsoft Copilot Studio Open your agent's Tools \u2192 Add a tool \u2192 New tool \u2192 Model Context Protocol . Name the server VentilatePro HVAC and enter https://ventilatepro.com/mcp . Use Streamable HTTP . Choose OAuth 2.0 \u2192 Dynamic discovery , create the tool, then select Create a new connection . Copilot discovers and registers its client automatically. Sign in to VentilatePro, review the requested permissions and return address, and approve the connection. Add it to your agent. Verify MCP initialization and tool discovery, then call vp_calculate_psychrometrics with {\"dry_bulb\":75,\"relative_humidity\":50,\"units\":\"ip\"} . Check for errors and confirm a returned dry bulb of 75 \u00b0F. Registration uses /oauth/register ; the legacy POST /register fallback also works. Before first sign-in, the operator must configure the exact Microsoft callback in MCP_OAUTH_EXTRA_REDIRECT_URIS . If the saved connector does not display it, temporarily enable MCP_OAUTH_REGISTRATION_DIAGNOSTICS=true and retry: the server records method, path, and sanitized callback URIs while rejecting unapproved callbacks with 400 JSON. Verify and configure the observed URI, disable diagnostics, restart the application, and retry. Do not guess a callback or allow wildcard Microsoft domains. Authorization and code exchange must match the client's full registered callback exactly. All OAuth clients require S256 PKCE. The server supports public clients and registered client secrets with Basic or POST authentication. If scopes are requested explicitly, use advertised scopes such as projects:read calc:read calc:run . Refresh uses /oauth/token ; do not add OpenID scopes. Alternative: personal CLI token Create a separate token in VentilatePro Account Settings with the smallest suitable permissions. In Copilot select API key \u2192 Header , set the header name to Authorization , and enter Bearer <CLI_TOKEN> as the connection credential value, including the prefix. Do not select Query or put a token in a URL, agent instructions, prompts, or tool arguments. The connection acts as the token owner and keeps existing project permissions, scopes, revocation, and confirmation guards. Personal tokens do not refresh automatically. If an older connector retains discovery settings, recreate its failed connection/tool after deployment. Connector creation alone is not proof of a working connection: complete initialization, tool discovery, and the harmless calculation from Copilot. See Microsoft's MCP setup instructions .", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Connect an AI agent with OAuth\u2014no token copying", "url": "/exam/cli/mcp/#chatgpt-mcp", "text": "Connect an AI agent with OAuth\u2014no token copying VentilatePro exposes a public streamable-HTTP MCP server at https://ventilatepro.com/mcp . ChatGPT discovers VentilatePro's OAuth 2.1 metadata, opens the normal VentilatePro sign-in and consent screen, and sends short-lived scoped access tokens. Your password and refresh token are never exposed to the model. Enable ChatGPT developer mode In ChatGPT Settings, open Security and login and enable Developer mode . Workspace policy can control whether this option is available. Create a custom plugin Open ChatGPT Plugins, select the plus button, name it VentilatePro HVAC , choose Server URL , and enter the complete endpoint: https://ventilatepro.com/mcp Select OAuth ChatGPT reads the protected-resource and authorization-server discovery documents automatically. No client secret, API key, or advanced override is required. Sign in and approve VentilatePro shows every requested scope before issuing the connection. OAuth uses authorization code + S256 PKCE, one-time codes, one-hour access tokens, rotating refresh tokens, and exact ChatGPT callback validation. Review the tools Confirm that ChatGPT discovers the VentilatePro tool catalog, then add the connection to a new chat from the tools menu. Guarded operations retain their explicit confirmation checks; ordinary create and update tools may write immediately. Review the tool schema before calling it. Client menus and availability can change. See the official ChatGPT connection instructions for current account and workspace requirements.", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Connect a local agent in five steps", "url": "/exam/cli/mcp/#mcp-quickstart", "text": "Connect a local agent in five steps The PyPI package installs both the human-facing ventilatepro command and the local stdio server ventilatepro-mcp . The MCP server reuses the CLI login stored on the workstation; the token does not belong in the agent configuration. Install or update the package pipx install ventilatepro-cli pipx upgrade ventilatepro-cli Choose a token for project tools Offline calculation tools need no token. For project work, choose the smallest suitable preset in Account Settings; Agent Editor covers the full workflow. Create the token and copy the raw value when it is shown. Use a separate token per workstation or agent host so it can be revoked independently. Open Account Settings Log in locally Run the login command yourself and paste the token into the hidden prompt. Do not place the token in an MCP JSON file, repository, or agent prompt. ventilatepro auth login Run the agent health check Doctor checks the full Agent Editor setup: saved login, required scopes, catalog, and identity. It can report failure for a deliberately narrower token or an offline-only installation. For offline use, verify vp_list_hvac_calculations and a calculation tool directly in your client. ventilatepro mcp doctor Register the MCP server codex mcp add ventilatepro -- ventilatepro-mcp Restart or reconnect the MCP client after registration if it does not discover the tools immediately.", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Calculate locally without a token or network request", "url": "/exam/cli/mcp/#mcp-hvac-calculations", "text": "Calculate locally without a token or network request The local stdio server exposes the same tested calculator used by ventilatepro calc , so these tools do not authenticate or make a network request. The public ChatGPT transport requires OAuth for the MCP connection itself, including when ChatGPT invokes an otherwise offline calculation tool. Available tools include vp_calculate_psychrometrics , vp_calculate_sensible_load , vp_calculate_total_load , vp_calculate_air_process , vp_calculate_hydronic , vp_calculate_steam , vp_calculate_fan_power , vp_calculate_pump_power , vp_calculate_duct_size , and vp_calculate_lmtd . Read the calculation reference", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "JSON configuration", "url": "/exam/cli/mcp/#section-json-configuration", "text": "JSON configuration Claude Desktop and other JSON-configured MCP clients can launch the same stdio executable. {\n  \"mcpServers\": {\n    \"ventilatepro\": {\n      \"command\": \"ventilatepro-mcp\",\n      \"args\": []\n    }\n  }\n} If the client cannot find the executable, run where.exe ventilatepro-mcp on Windows or which ventilatepro-mcp on macOS/Linux and use that full path as command . Agent access stays scoped Tokens never bypass project membership or the web app's user permissions. Read and write scopes are checked again by the server for every request. ChatGPT OAuth access tokens expire after one hour; refresh tokens rotate on every use and can be revoked server-side. Broad, destructive, import, export, apply, and run operations require an explicit confirm=true MCP argument. Revit import confirmation also requires the unchanged review_token returned by a fresh read-only review. Generic MCP request/workflow tools cannot commit or discard Revit imports; agents must use the specialized guarded tools. Room categorization applies are stale-checked against current Revit identities and require reviewed reasons. Meeting recording is atomic and idempotent; invalid assignees reject the entire batch. Revoke a lost or unused token from Account Settings. CLI logout only clears the local copy.", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Agent access stays scoped", "url": "/exam/cli/mcp/#section-agent-access-stays-scoped", "text": "JSON configuration Claude Desktop and other JSON-configured MCP clients can launch the same stdio executable. {\n  \"mcpServers\": {\n    \"ventilatepro\": {\n      \"command\": \"ventilatepro-mcp\",\n      \"args\": []\n    }\n  }\n} If the client cannot find the executable, run where.exe ventilatepro-mcp on Windows or which ventilatepro-mcp on macOS/Linux and use that full path as command . Agent access stays scoped Tokens never bypass project membership or the web app's user permissions. Read and write scopes are checked again by the server for every request. ChatGPT OAuth access tokens expire after one hour; refresh tokens rotate on every use and can be revoked server-side. Broad, destructive, import, export, apply, and run operations require an explicit confirm=true MCP argument. Revit import confirmation also requires the unchanged review_token returned by a fresh read-only review. Generic MCP request/workflow tools cannot commit or discard Revit imports; agents must use the specialized guarded tools. Room categorization applies are stale-checked against current Revit identities and require reviewed reasons. Meeting recording is atomic and idempotent; invalid assignees reject the entire batch. Revoke a lost or unused token from Account Settings. CLI logout only clears the local copy.", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Agents follow the memory playbook", "url": "/exam/cli/mcp/#memory-playbook", "text": "Agents follow the memory playbook Each project keeps its notes, decisions, and tasks as memory that every agent shares. Before an agent writes to it, the\n        conversation loads the memory playbook: how to search, what to save, how to log a session, and how to tidy memory. vp_memory_context loads it at the start of work on a project; an agent that skips it is asked to load it on its\n        first write. It works in every MCP client with no setup. Optional: install the skill Clients that support Agent Skills (Claude, Claude Code) can install the same playbook so it is at hand before the first call. Upload the zip as a skill, or unzip it into ~/.claude/skills/ . Download ventilatepro-memory.zip Optional: add to your instructions Paste into a Claude project, ChatGPT custom instructions, or CLAUDE.md : When working on a VentilatePro project, call vp_memory_context first and follow the memory playbook it returns. Search project memory before answering, and log the session with vp_log_session before finishing.", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Useful first operations", "url": "/exam/cli/mcp/#section-useful-first-operations", "text": "Useful first operations Revit import review Inspect staged room and zone changes, conflicts, and options before approving the exact reviewed revision. ventilatepro revit-imports review --project 123 --json Room equipment Inspect rooms with modeled plumbing, hydronic, environmental, and informational heat-gain requirements. ventilatepro room-equipment summary --project 123 Room categorization Export a guarded review artifact, make explicit engineering decisions, and apply only confirmed non-stale rows. ventilatepro categorization review --project 123 --output room-categorization.json Meeting capture Resolve project members, record structured minutes, and create assigned project tasks in one transaction. ventilatepro meetings context --project 123 --json", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Discover MCP tools and their current schemas", "url": "/exam/cli/mcp/#mcp-tool-discovery", "text": "Discover MCP tools and their current schemas MCP lets an AI client discover callable tools and their typed arguments. After connecting, use the client's tool listing ( tools/list ) as the authority for the installed server. Tool availability and permission to execute a tool are separate: appearing in the catalog does not grant access to a project. Purpose Tool First input or next step Offline calculator catalog vp_list_hvac_calculations {} ; inspect formulas and required inputs. Moist-air properties vp_calculate_psychrometrics {\"dry_bulb\": 75, \"relative_humidity\": 50, \"units\": \"ip\"} ; dry bulb is \u00b0F and RH is percent. Identity and granted scopes vp_whoami {} ; requires project-tool authentication. Supported workflows vp_describe_capabilities {} ; also attempts to fetch server API schema metadata. Request schema vp_get_schema {\"schema_key\": \"api_request\"} ; inspect before composing a generic request. Project discovery vp_list_projects {\"limit\": 20, \"offset\": 0} ; select the returned project ID. Review a staged Revit import vp_review_revit_import Pass the actual project_id ; inspect the returned changes and review token. Commit the reviewed import vp_confirm_revit_import Requires project_id , import_id , the unchanged review_token , and confirm: true . Resources include ventilatepro://auth/me , ventilatepro://projects , and project templates such as ventilatepro://projects/{project_id}/hierarchy . These are MCP resource URIs, not browser URLs. Discover resources and templates through the client; project resources require authentication.", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Run an inspectable engineering workflow", "url": "/exam/cli/mcp/#mcp-review-workflow", "text": "Run an inspectable engineering workflow Discover tools, verify identity and scopes, then list projects. Resolve IDs from returned records instead of guessing names or using example IDs. Read the relevant rooms, AHUs, calculation status, or pending import. Fetch every page when reviewing an entire schedule. Present the inputs, units, calculation basis, affected records, and proposed changes. Preserve user overrides and explain assumptions. Use the specialized write tool and its schema. Supply confirmation only for an authorized operation. A confirm argument is a programmatic guard, not proof that a person approved the change. Some ordinary create/update tools write without that argument. If the review becomes stale, fetch a new review and compare changes again. Do not reuse an old import token or route around the specialized tool. Read back changed records and report results, unresolved issues, and calculation freshness. A successful write does not by itself prove engineering adequacy. Example first prompt: \u201cUse VentilatePro to list my projects and let me identify the target. Read its rooms and calculation status, then report missing inputs and stale results with record IDs. Keep this review read-only.\u201d Example calculator prompt: \u201cUse VentilatePro psychrometrics for 75 \u00b0F dry bulb and 50% RH at sea level. Report wet bulb, dew point, humidity ratio, enthalpy, pressure, and units. Explain the pressure assumption.\u201d", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Understand transport and tool errors", "url": "/exam/cli/mcp/#mcp-transport-errors", "text": "Understand transport and tool errors The local ventilatepro-mcp process speaks MCP over stdin/stdout. Let the client launch it; an idle terminal is expected when no protocol messages arrive. Do not add banners or other text to its stdout. GUI clients may have a different PATH or OS credential context than your terminal. The hosted https://ventilatepro.com/mcp endpoint expects an MCP client with OAuth or a personal CLI bearer token. Unauthenticated GET and POST return a discovery challenge; it is not an HTML documentation page. For Copilot's API-key alternative choose Header, name Authorization , and credential value Bearer <CLI_TOKEN> . Never put credentials in query parameters or agent instructions. Check both the protocol result and the tool payload. A completed HTTP request can still contain a tool error. Inspect isError where supplied and any structured error object before interpreting the response as engineering data. See the recovery reference .", "page": "AI agents and MCP", "group": "Integrations"}, {"title": "Notes workflow", "page": "Notes workflow", "url": "/exam/cli/notes/", "text": "Capture HVAC field notes from the terminal, search project records, and synchronize queued notes with idempotent retries using VentilatePro CLI.", "group": "Integrations"}, {"title": "Create notes", "url": "/exam/cli/notes/#section-create-notes", "text": "Create notes A note has a kind: note for reference material and quick captures, meeting , call , site_visit , or agent_session . Titles may be provided explicitly or derived from the first non-empty body line. ventilatepro notes create --project 123 --body \"Captured from terminal\" cat site-walk.md | ventilatepro notes create --project 123 --stdin --tags field,urgent --project is required because notes are project-scoped. --title is optional. --body and --stdin are mutually exclusive. --tags stores tags on the note and also powers filtering. --kind sets the kind; --pinned marks a key reference agents always load. --occurred-at records when it happened ( --captured-at still works).", "page": "Notes workflow", "group": "Integrations"}, {"title": "Read notes", "url": "/exam/cli/notes/#section-read-notes", "text": "Read notes notes list and notes show read notes and decisions together, pinned notes first. notes update can re-kind, pin, or archive a note. ventilatepro notes list --project 123 ventilatepro notes show note:42 --project 123 ventilatepro notes list --project 123 --json Field Meaning note_ref note:42 or decision:7 . Older general-info: and design-minute: references still resolve. type note or decision ; notes also carry kind , pinned , and archived . source Origin of the note, currently `cli` or `web`. tags Tag list used for filtering and search. metadata Extra fields for note types like meeting minutes and decisions.", "page": "Notes workflow", "group": "Integrations"}, {"title": "Filter and search", "url": "/exam/cli/notes/#section-filter-and-search", "text": "Filter and search Use structured filters to narrow the note feed without building a second local index. Option Behavior --type Filter to note or decision ; --kind , --pinned , and --include-archived narrow further. --source Filter by `cli` or `web` origin. --tags Comma-separated tags; all listed tags must be present. --query Searches note ref, title, body, tags, and metadata strings. ventilatepro notes list --project 123 --kind meeting --source cli --tags field,urgent --query terminal", "page": "Notes workflow", "group": "Integrations"}, {"title": "Offline queue and sync", "url": "/exam/cli/notes/#section-offline-queue-and-sync", "text": "Offline queue and sync `notes create` safely queues the note locally on network failures and server 5xx responses. Later, `notes sync` retries the queued payload using the same idempotency key. ventilatepro notes sync ventilatepro notes sync --project 123 Network errors and 5xx responses are queueable. 4xx validation errors and auth errors are not queued. A successfully queued note still returns exit code 0 so capture workflows do not fail unnecessarily. `notes sync` returns non-zero when queued items still fail after retry.", "page": "Notes workflow", "group": "Integrations"}, {"title": "CLI API reference", "page": "CLI API reference", "url": "/exam/cli/api/", "text": "Integrate with the scoped VentilatePro CLI API: bearer authentication, endpoint discovery, pagination, idempotency, error handling, and MCP boundaries.", "group": "Integrations"}, {"title": "Discover the contract before building an integration", "url": "/exam/cli/api/#integration-contract", "text": "Discover the contract before building an integration The CLI HTTP API and remote MCP are different interfaces. Use a personal CLI bearer token with /api/cli/ . Use an MCP client with OAuth or a personal CLI bearer token with /mcp ; that endpoint exchanges MCP protocol messages rather than accepting REST resource paths. Start with GET /api/cli/auth/me/ , then GET /api/cli/schemas/ and the relevant resource list. Build requests from the returned schema and records. Keep trailing slashes on CLI API routes. Send JSON bodies with Content-Type: application/json where the endpoint expects JSON; uploads use their documented file contract. Paginated lists normally return {\"count\": 0, \"limit\": 20, \"offset\": 0, \"results\": []} . This example is an empty page, not a live response. Consume all pages for a complete audit, preserve filters, and tolerate additional response fields. Consult the specific endpoint for detail and job-result shapes. A scope is one authorization check; it does not replace membership, object permissions, or field validation. CLI --yes and MCP confirm are interface-level controls and are not universal HTTP headers or a guarantee that every direct REST write has the same review flow. Integrators must preserve review and approval requirements themselves. Apply finite timeouts. For a failed write, distinguish rejection from an unknown outcome before retrying. Use Idempotency-Key only on supported endpoints and preserve it for the same logical operation. Never infer that a proxy endpoint is safe or supported merely because its path resembles an internal web-app route. See scripting and pagination and error recovery .", "page": "CLI API reference", "group": "Integrations"}, {"title": "Authentication model", "url": "/exam/cli/api/#section-authentication-model", "text": "Authentication model Authenticate with Authorization: Bearer <token> . Idempotent create workflows such as notes and meeting recording use an Idempotency-Key . Token creation and revocation happen in the web UI account settings area. Scopes and project permissions are enforced for every direct or proxied request.", "page": "CLI API reference", "group": "Integrations"}, {"title": "Endpoints", "url": "/exam/cli/api/#section-endpoints", "text": "Endpoints Method Path Purpose GET /api/cli/auth/me/ Validate the token and return the current user. GET /api/cli/schemas/ Discover machine-readable schema metadata available to the current token. GET /api/cli/projects/ List accessible projects for the current user. GET / POST /api/cli/room-equipment/ List or create room equipment through the parent room's project access. GET /api/cli/room-equipment/summary/?project=<id> Return only rooms with modeled equipment and calculated W/ft\u00b2. GET / PATCH / DELETE /api/cli/room-equipment/<id>/ Inspect, update, or delete one equipment record. GET /api/cli/proxy/projects/<id>/revit-imports/pending/ Read the pending staged Revit import and its computed diff. POST /api/cli/proxy/revit-imports/<id>/commit/ Commit a validated pending import through an imports:write token. GET / POST /api/cli/projects/<id>/categorization/<operation>/ Review, preview, and apply guarded room categorization decisions. POST /api/cli/notes/ Create a note (any kind: note, meeting, call, site_visit, agent_session). GET /api/cli/notes/?project=<id>&limit=<n>&offset=<n>&type=<type>&source=<source>&tag=<tag>&q=<text> List normalized notes with pagination, filters, and search. GET /api/cli/notes/<note_ref>/?project=<id> Fetch one normalized note by typed reference. ANY APPROVED /api/cli/proxy/<approved-path> Reach approved HVAC, notes, and AI routes through CLI scopes and server permissions.", "page": "CLI API reference", "group": "Integrations"}, {"title": "Room equipment contract", "url": "/exam/cli/api/#section-room-equipment-contract", "text": "Room equipment contract Every equipment record belongs to one room and inherits project access from that room. Heat may be entered with heat_gain_value plus heat_gain_unit : W , KW , or BTU_H . Responses include canonical watts, total quantity heat, room W/ft\u00b2, environmental limits, plumbing/fuel flags, and hydronic requirements. Equipment heat remains informational and is not added to room cooling-load calculations. MCP proxy guardrails Supported targets are restricted to approved HVAC, notes, and Gemini route prefixes. Scope checks are derived from both HTTP method and target path. Broad, destructive, import, export, apply, and run tools require confirm=true client-side. The destination endpoint still performs normal serializer, validation, project-membership, and permission checks. Revit import contract Review returns room and zone changes, conflicts, import options, metadata, and a token for the exact staged revision. The first-class CLI and MCP confirmation commands accept no replacement payload; they commit only the reviewed session. A changed payload, options object, diff, status, or update timestamp invalidates the review token. Generic MCP request/workflow tools reject commit and discard paths so the review-token guard cannot be bypassed. The server repeats access, pending-status, payload-validation, and diff checks at commit time.", "page": "CLI API reference", "group": "Integrations"}, {"title": "MCP proxy guardrails", "url": "/exam/cli/api/#section-mcp-proxy-guardrails", "text": "Room equipment contract Every equipment record belongs to one room and inherits project access from that room. Heat may be entered with heat_gain_value plus heat_gain_unit : W , KW , or BTU_H . Responses include canonical watts, total quantity heat, room W/ft\u00b2, environmental limits, plumbing/fuel flags, and hydronic requirements. Equipment heat remains informational and is not added to room cooling-load calculations. MCP proxy guardrails Supported targets are restricted to approved HVAC, notes, and Gemini route prefixes. Scope checks are derived from both HTTP method and target path. Broad, destructive, import, export, apply, and run tools require confirm=true client-side. The destination endpoint still performs normal serializer, validation, project-membership, and permission checks. Revit import contract Review returns room and zone changes, conflicts, import options, metadata, and a token for the exact staged revision. The first-class CLI and MCP confirmation commands accept no replacement payload; they commit only the reviewed session. A changed payload, options object, diff, status, or update timestamp invalidates the review token. Generic MCP request/workflow tools reject commit and discard paths so the review-token guard cannot be bypassed. The server repeats access, pending-status, payload-validation, and diff checks at commit time.", "page": "CLI API reference", "group": "Integrations"}, {"title": "Revit import contract", "url": "/exam/cli/api/#section-revit-import-contract", "text": "Room equipment contract Every equipment record belongs to one room and inherits project access from that room. Heat may be entered with heat_gain_value plus heat_gain_unit : W , KW , or BTU_H . Responses include canonical watts, total quantity heat, room W/ft\u00b2, environmental limits, plumbing/fuel flags, and hydronic requirements. Equipment heat remains informational and is not added to room cooling-load calculations. MCP proxy guardrails Supported targets are restricted to approved HVAC, notes, and Gemini route prefixes. Scope checks are derived from both HTTP method and target path. Broad, destructive, import, export, apply, and run tools require confirm=true client-side. The destination endpoint still performs normal serializer, validation, project-membership, and permission checks. Revit import contract Review returns room and zone changes, conflicts, import options, metadata, and a token for the exact staged revision. The first-class CLI and MCP confirmation commands accept no replacement payload; they commit only the reviewed session. A changed payload, options object, diff, status, or update timestamp invalidates the review token. Generic MCP request/workflow tools reject commit and discard paths so the review-token guard cannot be bypassed. The server repeats access, pending-status, payload-validation, and diff checks at commit time.", "page": "CLI API reference", "group": "Integrations"}, {"title": "Create request", "url": "/exam/cli/api/#section-create-request", "text": "Create request {\n  \"project\": 1,\n  \"title\": \"Field Note\",\n  \"body\": \"Captured from terminal.\",\n  \"tags\": [\"cli\", \"field-note\"],\n  \"captured_at\": \"2026-03-10T10:00:00-07:00\"\n} Normalized note response {\n  \"note_ref\": \"note:42\",\n  \"type\": \"note\",\n  \"kind\": \"note\",\n  \"project_id\": 1,\n  \"title\": \"Field Note\",\n  \"body\": \"Captured from terminal.\",\n  \"tags\": [\"cli\", \"field-note\"],\n  \"source\": \"cli\",\n  \"captured_at\": \"2026-03-10T10:00:00-07:00\",\n  \"created_at\": \"2026-03-10T10:00:01-07:00\",\n  \"updated_at\": \"2026-03-10T10:00:01-07:00\",\n  \"metadata\": {}\n}", "page": "CLI API reference", "group": "Integrations"}, {"title": "Normalized note response", "url": "/exam/cli/api/#section-normalized-note-response", "text": "Create request {\n  \"project\": 1,\n  \"title\": \"Field Note\",\n  \"body\": \"Captured from terminal.\",\n  \"tags\": [\"cli\", \"field-note\"],\n  \"captured_at\": \"2026-03-10T10:00:00-07:00\"\n} Normalized note response {\n  \"note_ref\": \"note:42\",\n  \"type\": \"note\",\n  \"kind\": \"note\",\n  \"project_id\": 1,\n  \"title\": \"Field Note\",\n  \"body\": \"Captured from terminal.\",\n  \"tags\": [\"cli\", \"field-note\"],\n  \"source\": \"cli\",\n  \"captured_at\": \"2026-03-10T10:00:00-07:00\",\n  \"created_at\": \"2026-03-10T10:00:01-07:00\",\n  \"updated_at\": \"2026-03-10T10:00:01-07:00\",\n  \"metadata\": {}\n}", "page": "CLI API reference", "group": "Integrations"}, {"title": "List query parameters", "url": "/exam/cli/api/#section-list-query-parameters", "text": "List query parameters Parameter Behavior project Required. Restricts reads to one project scope. limit / offset Pagination for the normalized note feed. type note or decision . Use kind to narrow notes. source Filter by note origin such as cli or web . tag Repeat the parameter or let the CLI send a comma-split tag set. q Free-text search over note ref, title, body, tags, and metadata strings. Operational notes POST /api/cli/notes/ creates notes; decisions go through the decisions endpoints. Idempotent retries return the original create result when the same Idempotency-Key is reused. Queueable client behavior is reserved for network failures and server 5xx responses. 4xx auth and validation failures must be fixed by the caller before retrying.", "page": "CLI API reference", "group": "Integrations"}, {"title": "Operational notes", "url": "/exam/cli/api/#section-operational-notes", "text": "List query parameters Parameter Behavior project Required. Restricts reads to one project scope. limit / offset Pagination for the normalized note feed. type note or decision . Use kind to narrow notes. source Filter by note origin such as cli or web . tag Repeat the parameter or let the CLI send a comma-split tag set. q Free-text search over note ref, title, body, tags, and metadata strings. Operational notes POST /api/cli/notes/ creates notes; decisions go through the decisions endpoints. Idempotent retries return the original create result when the same Idempotency-Key is reused. Queueable client behavior is reserved for network failures and server 5xx responses. 4xx auth and validation failures must be fixed by the caller before retrying.", "page": "CLI API reference", "group": "Integrations"}, {"title": "Troubleshooting", "page": "Troubleshooting", "url": "/exam/cli/troubleshooting/", "text": "Fix VentilatePro installation, PATH, login, token scopes, MCP connection, validation, and note sync errors with actionable recovery steps.", "group": "Resources"}, {"title": "Authentication failures", "url": "/exam/cli/troubleshooting/#section-authentication-failures", "text": "Authentication failures If login fails immediately, verify the base URL and the copied token value. If `auth whoami` fails after a previous login, the token may have been revoked or expired. Use `ventilatepro auth logout` to clear local credentials, then log in again with a new token. Revocation happens in the VentilatePro web UI, not from the CLI.", "page": "Troubleshooting", "group": "Resources"}, {"title": "Project and note access", "url": "/exam/cli/troubleshooting/#section-project-and-note-access", "text": "Project and note access If `projects list` returns nothing, the authenticated user does not currently have access to any projects. If `notes list` or `notes create` returns a project access error, confirm that the project ID belongs to the logged-in user or a shared project membership. If `notes show` fails, verify both the `note_ref` and the `--project` argument.", "page": "Troubleshooting", "group": "Resources"}, {"title": "MCP and AI-agent setup", "url": "/exam/cli/troubleshooting/#section-mcp-and-ai-agent-setup", "text": "MCP and AI-agent setup Run ventilatepro mcp doctor before configuring the AI client. It checks login, Agent Editor scopes, catalog loading, and identity. If doctor reports missing scopes, create a new Agent Editor token. Existing tokens are not silently expanded. If the client cannot find ventilatepro-mcp , run where.exe ventilatepro-mcp on Windows or which ventilatepro-mcp on macOS/Linux and configure the full path. After changing MCP configuration, restart or reconnect the client so it reloads the server catalog. Keep the token out of MCP JSON. The local server reuses the credential saved by ventilatepro auth login .", "page": "Troubleshooting", "group": "Resources"}, {"title": "Queue and sync behavior", "url": "/exam/cli/troubleshooting/#section-queue-and-sync-behavior", "text": "Queue and sync behavior Situation Queued? What to do Network error Yes Run `ventilatepro notes sync` after connectivity returns. Server 5xx Yes Retry later; the queued note keeps the same idempotency key. Auth error No Fix credentials and rerun the command. Validation error No Fix the command arguments or payload and rerun.", "page": "Troubleshooting", "group": "Resources"}, {"title": "Exit behavior", "url": "/exam/cli/troubleshooting/#section-exit-behavior", "text": "Exit behavior `notes create` returns exit code 0 when the note is created immediately. `notes create` also returns exit code 0 when the note is safely queued locally. `notes create` returns non-zero for hard failures such as auth or validation problems. `notes sync` returns non-zero when one or more queued notes still fail during the retry run.", "page": "Troubleshooting", "group": "Resources"}, {"title": "Install and upgrade issues", "url": "/exam/cli/troubleshooting/#section-install-and-upgrade-issues", "text": "Install and upgrade issues Preferred install path: pipx install ventilatepro-cli Preferred upgrade path: pipx upgrade ventilatepro-cli Fallback install path when `pipx` is unavailable: python -m pip install ventilatepro-cli Contact support", "page": "Troubleshooting", "group": "Resources"}, {"title": "CLI and MCP failure recovery reference", "url": "/exam/cli/troubleshooting/#recovery-reference", "text": "CLI and MCP failure recovery reference Symptom Check Recovery Executable not found where.exe ventilatepro-mcp on Windows; command -v ventilatepro-mcp on macOS/Linux Run python -m pipx ensurepath , reopen the terminal/client, or configure the absolute executable path. Escape Windows backslashes in JSON. Local status says authenticated, but calls fail auth status checks saved credentials; auth whoami makes a live request. Verify the base URL, token validity, and account using ventilatepro auth whoami . 401 or OAuth reconnect required Expired/revoked credentials or the wrong authentication mechanism Reconnect OAuth for remote MCP; log in with a valid personal token for CLI/local project tools. 403 or missing scopes Granted scopes and project membership Use the appropriate token preset and verify project access. Doctor expects the full Agent Editor scope set; narrower access may be intentional. 404 for a record Record ID, typed reference, project context, and permissions Rediscover the record from an authorized list. Do not assume an inaccessible ID proves deletion. Validation, confirmation, or stale-review error Field errors, tool schema, current review revision Correct inputs or fetch a fresh review. Inspect changes before confirming; do not blindly retry. 429, server failure, or network timeout Rate-limit information, connectivity, and whether the operation was accepted For reads, retry with bounded backoff and honor Retry-After when supplied. For writes, reconcile state or use the operation's existing idempotency key before retrying. Local MCP works in terminal but fails in a desktop client Executable path, OS user, config directory, and keyring availability Run the client in the intended user context. VENTILATEPRO_CONFIG_DIR and VENTILATEPRO_DATA_DIR override local paths; they are not independent keyring identities. For a support request, include the package version from pipx list , operating system, client name, sanitized command, error, and whether an offline calculator succeeds. Doctor output can include your identity; redact personal and project data before sharing. Never send tokens, Authorization headers, or config.json .", "page": "Troubleshooting", "group": "Resources"}, {"title": "Read docs with an agent", "page": "Read docs with an agent", "url": "/exam/cli/agents/", "text": "Discover public VentilatePro HTML and Markdown documentation, the synchronized LLM index and full corpus, and current MCP tool schemas.", "group": "Resources"}, {"title": "Read public documentation without signing in", "url": "/exam/cli/agents/#read-documentation", "text": "Read public documentation without signing in Every documentation page is server-rendered HTML. Its article, headings, links, and examples are available without JavaScript or an account. Use View Markdown on any page for the same content as plain Markdown. The Markdown export, search index, and consolidated guide are generated from the same article templates as the human-facing pages. /llms.txt : concise discovery index with HTML and Markdown links. /llms-full.txt : complete documentation corpus for retrieval. ChatGPT workspace Markdown : connection, calculators, prompt examples, project review, and limits. Documentation search index : page and section text with navigable URLs. /sitemap.xml and /robots.txt : public-page discovery and crawl policy. curl -fsS https://ventilatepro.com/exam/cli/chatgpt.md\ncurl -fsS https://ventilatepro.com/llms-full.txt If an HTTP client receives an edge challenge or a 403 response, report the URL and status to support. An access-policy declaration alone does not prove that a particular client can fetch the site.", "page": "Read docs with an agent", "group": "Resources"}, {"title": "Discover the connected server's tools", "url": "/exam/cli/agents/#discover-tools", "text": "Discover the connected server's tools Documentation explains workflows; the connected server's tools/list schemas define callable tools and arguments. Registry name: com.ventilatepro/ventilatepro . The ChatGPT sidebar workspace uses https://ventilatepro.com/mcp/workspace with projects:read , entities:read , and calc:read . Its calculator and saved-result tools are read-only. The wider MCP integration uses https://ventilatepro.com/mcp remotely or ventilatepro-mcp locally. Discover current capabilities with vp_describe_capabilities . Local calculator tools run without authentication. Remote MCP connections require OAuth, including for calculator calls. For project tools, verify identity, scopes, and membership. Resolve record IDs through accessible lists and inspect all relevant pages. Follow tool discovery and the API contract before constructing automation. The public documentation does not grant access to private project records.", "page": "Read docs with an agent", "group": "Resources"}, {"title": "Keep engineering answers traceable", "url": "/exam/cli/agents/#report-results", "text": "Keep engineering answers traceable Report the inputs, units, formula or basis, source records, and calculation freshness. Check isError and structured errors before treating a tool response as engineering data. Use the connected schema for specialized guarded writes and obtain authorization for the intended operation. Public documentation may be crawled, indexed, quoted with attribution, and used for retrieval. Public documentation access is independent of private project access. Product references: feature catalog , changelog , and support .", "page": "Read docs with an agent", "group": "Resources"}]}