Skip to main content
Glama
gabrielserrao

pyResToolbox MCP Server

pyResToolbox MCP Server

Bring Reservoir Engineering Calculations to AI

Power your AI assistants with industry-standard petroleum engineering calculations

License: GPL v3 Python 3.10+ Tests FastMCP Production Ready

Model Context Protocol Built with pyResToolbox Buy Me A Coffee

Quick StartFeaturesExamplesDocumentationContributing


108 Production-Ready Tools | Field & Metric Units | Zero Configuration

PVT AnalysisWell PerformanceNodal AnalysisDCAMaterial BalanceSimulation SupportBrine PropertiesGeomechanicsHeterogeneity Analysis


A production-ready Model Context Protocol (MCP) server that gives AI agents like Claude access to the comprehensive reservoir engineering library pyResToolbox. Now Claude can perform sophisticated PVT calculations, well performance analysis, and reservoir simulation tasks through natural conversation.

pyResToolbox MCP Demo


☕ Support This Project

If you find this project useful, consider buying me a coffee! Your support helps maintain and improve this open-source tool.


Related MCP server: CalcsLive MCP Server

What is This?

This MCP server bridges the gap between AI assistants and petroleum engineering workflows. Instead of manually calculating reservoir properties or writing complex scripts, you can simply ask Claude:

"Calculate the bubble point pressure for API 35° oil at 180°F with solution GOR of 800 scf/stb and gas gravity 0.75 using the Valko-McCain correlation"

"Generate an IPR curve for my well with Pi=4000 psia, Pb=3500 psia, API 38°, 175°F, pay thickness 75 ft, permeability 150 mD"

"Create a black oil table for simulation with pressures from 500 to 5000 psia"

Claude will execute the calculations using industry-standard correlations and return accurate, formatted results.

Built On

  • pyResToolbox by Mark Burgoyne - Comprehensive Python library for reservoir engineering calculations

  • FastMCP - Modern Python framework for building MCP servers

  • Model Context Protocol by Anthropic - Standard for AI-application integration

Key Features

  • 108 Production-Ready Tools - All tools tested and validated

  • Industry-Standard Correlations - Standing, Valko-McCain, Velarde, DAK, Beggs-Robinson, Corey, LET, and more

  • Dual Unit Support - Field units (psia, °F, ft) and Metric units (barsa, °C, m)

  • Array Support - Calculate properties at multiple pressures simultaneously

  • Zero Configuration - Works out of the box with Claude Desktop

  • GPL-3.0 Licensed - Free and open source


Quick Start

Installation

Prerequisites: Python 3.10+ (UV package manager recommended but optional)

# 1. Clone the repository
git clone https://github.com/gabrielserrao/pyrestoolbox-mcp.git
cd pyrestoolbox-mcp

# 2. Install UV (optional but 10-100x faster than pip)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 3. Setup and test
make uv-install    # Creates venv and installs dependencies
make uv-test       # Verifies all 108 tools work correctly

Connect to Claude Desktop

Add this to your Claude Desktop config file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json

IMPORTANT: Use absolute paths for both uv and the project directory. GUI applications like Claude Desktop don't inherit your terminal's PATH.

Find your UV path:

# macOS/Linux
which uv

# Windows (PowerShell)
Get-Command uv | Select-Object -ExpandProperty Source

Configuration:

{
  "mcpServers": {
    "pyrestoolbox": {
      "command": "/absolute/path/to/uv",
      "args": [
        "run",
        "--directory",
        "/absolute/path/to/pyrestoolbox-mcp",
        "fastmcp",
        "run",
        "server.py"
      ]
    }
  }
}

Common UV paths:

  • macOS/Linux: /Users/username/.local/bin/uv or /home/username/.local/bin/uv

  • Windows: C:\Users\username\.cargo\bin\uv.exe

Example (macOS):

{
  "mcpServers": {
    "pyrestoolbox": {
      "command": "/Users/john/.local/bin/uv",
      "args": [
        "run",
        "--directory",
        "/Users/john/projects/pyrestoolbox-mcp",
        "fastmcp",
        "run",
        "server.py"
      ]
    }
  }
}

Example (Linux):

{
  "mcpServers": {
    "pyrestoolbox": {
      "command": "/home/john/.local/bin/uv",
      "args": [
        "run",
        "--directory",
        "/home/john/projects/pyrestoolbox-mcp",
        "fastmcp",
        "run",
        "server.py"
      ]
    }
  }
}

Example (Windows):

{
  "mcpServers": {
    "pyrestoolbox": {
      "command": "C:\\Users\\john\\.cargo\\bin\\uv.exe",
      "args": [
        "run",
        "--directory",
        "C:\\Users\\john\\projects\\pyrestoolbox-mcp",
        "fastmcp",
        "run",
        "server.py"
      ]
    }
  }
}

Restart Claude Desktop completely (Quit and reopen, not just close the window) and you're ready to go!


The SKILL/ folder in this repository contains a pre-built skill that teaches your AI assistant exactly how to use all 108 tools — correct parameter names, valid method codes, validation constraints, and multi-step workflows.

What's included:

File

Purpose

SKILL/pyrestoolbox-mcp.skill

Ready-to-install skill bundle (zip format)

SKILL/SKILL.md

Skill definition with YAML front-matter trigger conditions

SKILL/tools-reference.md

Complete parameter reference for all 108 tools

Installation (Claude Code):

Copy the skill file to your Claude skills directory:

cp SKILL/SKILL.md ~/.claude/skills/pyrestoolbox-mcp.md

# Optional but recommended — full parameter reference
mkdir -p ~/.claude/skills/references
cp SKILL/tools-reference.md ~/.claude/skills/references/tools-reference.md

Once installed, the skill activates automatically when you ask about reservoir engineering calculations, PVT analysis, well performance, geomechanics, or any pyResToolbox topic.

What the skill teaches the AI:

  • Exact parameter names (psd not pwf, sg not sg_g for gas tools, zmethod vs method)

  • All valid enum strings ("VALMC", "DAK", "SWOF", "COR", etc.)

  • Required vs optional parameters for every tool

  • Numeric validation constraints (API 0–100, gas SG 0.5–2.0, Poisson's ratio 0–0.5)

  • Common multi-step workflows (PVT analysis, well performance, simulation input, geomechanics drilling window)


Your First Query

Open Claude Desktop and try:

"What's the bubble point pressure for a 35° API oil at 180°F with 800 scf/stb solution GOR and 0.75 gas gravity?"

Claude will use the oil_bubble_point tool and return results like:

Bubble Point Pressure: 3,456.7 psia
Method: Valko-McCain (VALMC)
Inputs: API=35°, T=180°F, Rs=800 scf/stb, SG_gas=0.75

What Can You Do?

Oil PVT Analysis

  • Calculate bubble point pressure (Standing, Valko-McCain, Velarde)

  • Solution GOR, formation volume factor, viscosity, density, compressibility

  • Generate comprehensive black oil tables for simulators

Gas PVT Analysis

  • Z-factor calculations (DAK, Hall-Yarborough, WYW, BUR/Peng-Robinson EOS)

  • Hydrogen-capable gas PVT via BUR method (SPE-229932-MS) - handles arbitrary mixtures including pure CO₂ and 30%+ H₂

  • Critical properties with contaminants (CO₂, H₂S, N₂, H₂)

  • Gas viscosity, density, compressibility, pseudopressure

  • Formation volume factors, hydrate prediction, water content

Well Performance & IPR

  • Oil and gas production rates (radial and linear flow)

  • IPR curve generation for vertical and horizontal wells

  • Vogel IPR for pressures below bubble point

  • Sensitivity analysis for permeability, skin, reservoir pressure

Reservoir Simulation Support

  • Relative permeability tables (SWOF, SGOF, SGWFN) with Corey, LET, and Jerauld curve families

  • Rel perm fitting - fit lab data to any model family, or auto-select best fit

  • LET physical feasibility checking

  • PVDO/PVDG/PVTO black oil tables and PVTW water PVT generation

  • VFPPROD/VFPINJ lift curve tables for ECLIPSE

  • Van Everdingen & Hurst aquifer influence functions (AQUTAB)

  • Rachford-Rice flash calculations for phase behavior

Nodal Analysis & VLP

  • Four multiphase VLP correlations: Woldesemayat-Ghajar (WG), Hagedorn-Brown (HB), Gray, Beggs & Brill (BB)

  • Multi-segment deviated and horizontal completions (not just vertical pipes)

  • IPR curve generation (gas, oil, water wells)

  • VLP outflow curves and operating point calculation

  • Production and injection modes supported

  • VFPPROD/VFPINJ table generation for ECLIPSE/Intersect simulators

  • GasPVT and OilPVT wrapper classes for consistent fluid characterization

Decline Curve Analysis (DCA)

  • Arps decline (exponential, hyperbolic, harmonic)

  • Rate and cumulative production forecasting

  • EUR estimation

  • Duong tight/unconventional decline

  • Production ratio analysis (WOR, GOR, WGR)

Material Balance

  • P/Z gas material balance for OGIP estimation

  • Havlena-Odeh oil material balance for OOIP estimation

  • Cole plot diagnostics and regression

Geomechanics & Wellbore Stability (27 tools)

  • Vertical/horizontal stress, pore pressure prediction (Eaton)

  • Fracture gradient, breakdown pressure, mud weight window

  • Borehole breakout, sand production, fault stability

  • Elastic moduli, rock strength, compaction, thermal stress

  • UCS from logs, stress polygon, critical drawdown

Brine Properties

  • CH₄-saturated brine properties (density, viscosity, FVF, compressibility)

  • CO₂-brine mutual solubility for sequestration studies

  • Soreide-Whitson VLE for multi-gas brine systems (CO₂, H₂S, N₂, H₂) with Sechenov salting-out corrections

  • IAPWS-IF97 freshwater density, Spivey/McCain salinity corrections

  • Per-component solubility, water content, and thermodynamic properties from a single framework

Advanced Calculations

  • Reservoir heterogeneity analysis (Lorenz coefficient, beta parameter)

  • Layer permeability distributions

  • Component library (critical properties for 100+ hydrocarbons)

  • Sensitivity analysis (parameter sweeps, tornado plots)

  • Method recommendation engine

Configuration & Help

  • Query available calculation methods and correlations

  • Access unit system documentation

  • Get physical constants

  • Comprehensive usage guides


Example Queries for Claude

Basic PVT Calculations

"Calculate Z-factor for gas with SG 0.7 at 3500 psia and 180°F using DAK method"

"What's the oil formation volume factor for 38° API oil at 3000 psia, 175°F with Rs=600?"

"Compare bubble point pressures using Standing, Valko-McCain, and Velarde for 35° API oil"

Well Performance Analysis

"Generate IPR curve for well: Pi=4000 psia, Pb=3500 psia, API 38, T=175°F,
 h=75 ft, k=150 mD, skin=-2, re=1500 ft, rw=0.5 ft"

"Calculate oil production rate at 2000 psia flowing pressure for the same well"

"Show me how permeability affects production - test 50, 100, 150, 200, 250 mD"

Simulation Preparation

"Generate a SWOF relative permeability table using Corey correlation with 25 rows,
 kromax=1.0, krwmax=0.25, swc=0.15, sorw=0.15, no=2.5, nw=1.5"

"Create aquifer influence functions for dimensionless radius 10.0"

"Generate black oil table from 500 to 5000 psia for 38° API oil at 175°F"

Reservoir Heterogeneity

"Convert Lorenz coefficient 0.5 to Dykstra-Parsons beta"

"Generate layered permeability distribution for Lorenz coefficient 0.6,
 10 layers, average permeability 100 mD"

Multi-Step Workflows

"Perform complete reservoir analysis: Calculate bubble point, generate PVT table,
 create IPR curve, and analyze well performance for 38° API oil at 175°F with
 initial pressure 4000 psia"

"Design a well completion: Calculate optimal flowing pressure, generate IPR,
 and compare different skin factors"

"Evaluate a gas reservoir: Calculate critical properties, generate IPR,
 and compare different Z-factor methods"

Advanced Queries

Comprehensive PVT Workflows

"Generate a complete PVT table for API 38 oil at 175°F with gas gravity 0.68
 and solution GOR 750 scf/stb. Include pressures from 500 to 4000 psia and
 show Rs, Bo, viscosity, and density"

"Compare bubble point pressures using Standing, Valko-McCain, and Velarde
 correlations for API 35 oil at 180°F with GOR 800 scf/stb"

"Calculate PVT properties at multiple pressures: 1000, 2000, 3000, and 4000 psia
 for API 38 oil at 175°F"

Gas Analysis

"Calculate the critical properties (Tc and Pc) for a gas with specific gravity 0.7
 containing 2% CO2, 1% H2S, and 3% N2"

"Compare Z-factors using DAK, HY, and WYW methods for a gas at 3500 psia and 180°F"

"Calculate gas pseudopressure from 1000 to 3500 psia for a gas with SG 0.7 at 180°F"

Well Performance & IPR

"Generate an IPR curve for an oil well with reservoir pressure 4000 psia,
 bubble point 3500 psia, API 38 oil at 175°F. Well has 75 ft net pay,
 150 mD permeability, skin -2, drainage radius 1500 ft"

"What's the oil production rate at 2000 psia flowing pressure for a well with
 Pi=4000 psia, Pb=3500 psia, API 35, 180°F, 50 ft pay, 100 mD permeability?"

"Generate a Vogel IPR curve for pressures below bubble point for API 38 oil"

Sensitivity Analysis

"How does oil rate change with permeability? Test values from 50 to 250 mD"

"What's the impact of skin factor on production? Compare rates for skin values
 from -5 to +10"

"Analyze the effect of net pay thickness on production rate: test 25, 50, 75,
 and 100 ft"

"How does reservoir pressure depletion affect production? Calculate rates at
 4000, 3500, 3000, and 2500 psia"

Brine & CO₂ Sequestration

"Calculate brine properties for fresh water at 3000 psia and 175°F"

"What are the properties of saline brine (5% NaCl) at reservoir conditions:
 3000 psia, 175°F?"

"Calculate CO₂-brine mutual solubility at 3000 psia and 180°F with salinity
 50000 ppm"

"Compare brine properties with and without CO₂ saturation at sequestration conditions"

Reservoir Heterogeneity

"Convert Lorenz coefficient 0.5 to Dykstra-Parsons beta parameter"

"Calculate Lorenz coefficient from production logging data: flow fractions
 [0.45, 0.25, 0.15, 0.10, 0.05] and permeability fractions [0.30, 0.25, 0.20, 0.15, 0.10]"

"Generate a layered permeability distribution for Lorenz coefficient 0.5,
 10 layers, average permeability 100 mD"

Phase Behavior & Flash Calculations

"Solve Rachford-Rice flash for a mixture with compositions [0.5, 0.3, 0.2]
 and K-values [2.5, 1.8, 0.6]"

"Calculate vapor-liquid equilibrium for a three-component system"

Component Library

"What are the critical properties for methane?"

"Get critical temperature and pressure for ethane, propane, and butane"

"What's the molecular weight of n-heptane?"

Economic & Optimization

"What's the optimal flowing pressure to maximize production? Generate IPR
 and find the sweet spot"

"Compare production rates for stimulated (skin -2) vs damaged (skin +5) wells"

"Analyze the impact of reservoir pressure depletion on well performance over time"

Comparison & Benchmarking

"Compare Standing vs Valko-McCain vs Velarde bubble point correlations for the same oil"

"Compare DAK vs HY vs WYW Z-factor methods and their impact on gas rate calculations"

"Compare radial vs linear flow geometries for the same reservoir properties"

Educational Queries

"Explain what bubble point pressure means and calculate it for API 35 oil"

"What's the difference between solution GOR and producing GOR? Calculate both"

"How does gas gravity affect Z-factor? Show me calculations for different gravities"

"Explain Lorenz coefficient and calculate it for a heterogeneous reservoir"

Troubleshooting & Validation

"Validate my PVT data: bubble point 3500 psia, API 38, 175°F, GOR 750 scf/stb -
 does this make sense?"

"Check if my gas composition is realistic: SG 0.7 with 5% CO2, 3% H2S, 2% N2"

"Verify my well performance calculation: Are these rates reasonable for the
 given reservoir properties?"

Tips for Better Queries

  1. Be Specific - Include all relevant parameters (API, temperature, pressure, etc.)

  2. Specify Methods - Mention which correlation you want (VALMC, DAK, Corey, LET, etc.)

  3. Include Units - Always specify units (psia, degF, mD, ft, etc.)

  4. Ask for Comparisons - Request comparisons between methods or scenarios

  5. Request Tables - Ask for tabulated results when you need multiple values

  6. Follow-up Questions - Build on previous answers for complex workflows


Unit System

All calculations default to Field Units (US Oilfield) per industry standard. Set metric: true on any tool to use Metric Units (Eclipse METRIC conventions: barsa, °C, metres, sm³/d) with no manual conversion needed. ECLIPSE keyword output automatically switches to METRIC headers.

Property

Unit

Example

Pressure

psia

3000 psia

Temperature

°F

180°F

Permeability

mD

100 mD

Pay Thickness

ft

50 ft

Viscosity

cP

0.85 cP

Oil Rate

STB/day

542 STB/day

Gas Rate

MSCF/day

1250 MSCF/day

Oil Gravity

API° or SG

35° API

Gas Gravity

SG (air=1)

0.75

Solution GOR

scf/stb

800 scf/stb

Oil FVF

rb/stb

1.25 rb/stb

Gas FVF

rcf/scf

0.0045 rcf/scf

Compressibility

1/psi

1.2×10⁻⁵ 1/psi

Density

lb/ft³

42.5 lb/ft³

Access complete unit documentation anytime by asking Claude: "What units does pyRestToolbox use?"


Architecture

Project Structure

pyrestoolbox-mcp/
├── src/pyrestoolbox_mcp/
│   ├── server.py              # Main MCP server (FastMCP)
│   ├── config.py              # Server configuration & constants
│   ├── tools/                 # 108 MCP tool implementations
│   │   ├── oil_tools.py       # 19 oil PVT tools
│   │   ├── gas_tools.py       # 15 gas PVT tools
│   │   ├── inflow_tools.py    # 4 well performance tools
│   │   ├── simtools_tools.py  # 11 simulation support tools
│   │   ├── nodal_tools.py     # 6 nodal analysis / VLP tools
│   │   ├── dca_tools.py       # 9 decline curve analysis tools
│   │   ├── matbal_tools.py    # 2 material balance tools
│   │   ├── brine_tools.py     # 3 brine property tools
│   │   ├── geomech_tools.py   # 27 geomechanics tools
│   │   ├── layer_tools.py     # 5 heterogeneity tools
│   │   ├── recommend_tools.py # 4 method recommendation tools
│   │   ├── sensitivity_tools.py # 2 sensitivity analysis tools
│   │   ├── library_tools.py   # 1 component library tool
│   │   └── gas_fixes.py       # Upstream bug workarounds
│   ├── models/                # Pydantic validation models
│   │   ├── oil_models.py
│   │   ├── gas_models.py
│   │   ├── inflow_models.py
│   │   ├── simtools_models.py
│   │   ├── nodal_models.py
│   │   ├── dca_models.py
│   │   ├── matbal_models.py
│   │   ├── brine_models.py
│   │   ├── geomech_models.py
│   │   ├── layer_models.py
│   │   ├── recommend_models.py
│   │   ├── sensitivity_models.py
│   │   ├── library_models.py
│   │   └── common_models.py
│   └── resources/             # MCP configuration resources
│       └── config_resources.py
├── tests/                     # Test suite (52 pytest tests)
│   ├── test_oil_tools.py
│   ├── test_gas_tools.py
│   ├── test_geomech_tools.py
│   ├── test_simtools_new.py
│   ├── test_dca_tools.py
│   ├── test_brine_new.py
│   ├── test_nodal_tools.py
│   ├── test_matbal_tools.py
│   ├── test_recommend_tools.py
│   └── conftest.py
├── examples/                  # 12 comprehensive workflow examples
│   ├── basic_usage.py
│   ├── pvt_workflow.py
│   ├── gas_well_analysis.py
│   └── ...
├── server.py                  # Entry point
├── pyproject.toml            # UV/pip configuration
├── Makefile                  # Development commands
├── Dockerfile                # Docker deployment
└── docker-compose.yml        # Multi-transport deployment

How It Works

  1. FastMCP Server - Handles MCP protocol communication (STDIO, HTTP, SSE)

  2. Pydantic Models - Validate all inputs with descriptive error messages

  3. Tool Layer - 108 functions wrapping pyrestoolbox calculations

  4. pyRestToolbox - Performs actual reservoir engineering calculations

  5. Type Conversion - Handles numpy/pandas/mpmath serialization for JSON

Tool Categories

Category

Count

Description

Oil PVT

19

Bubble point, Rs, Bo, viscosity, density, compressibility, black oil tables, PVT harmonization

Gas PVT

15

Z-factor, critical properties, Bg, viscosity, density, pseudopressure, hydrate prediction

Inflow

4

Oil/gas rates for radial/linear flow, IPR generation

Simulation

11

Relative permeability (Corey, LET, Jerauld), aquifer functions, flash, PVTW, black oil OG

Nodal / VLP

6

Flowing BHP, IPR/VLP curves, operating point, VFPPROD/VFPINJ tables

DCA

9

Arps decline, forecasting, EUR, Duong, ratio analysis

Material Balance

2

Gas P/Z and oil Havlena-Odeh OOIP/OGIP estimation

Brine

3

CH₄ and CO₂ saturated brine, Soreide-Whitson VLE

Geomechanics

27

Stress, pore pressure, fracture gradient, wellbore stability, sand production

Heterogeneity

5

Lorenz coefficient, beta conversion, layer distributions

Recommend

4

Method recommendation for gas, oil, VLP correlations

Sensitivity

2

Parameter sweeps and tornado sensitivity analysis

Library

1

Critical properties for 100+ components

Config

4

Units, methods, constants, help resources


pyResToolbox v3 Feature Coverage

This MCP server wraps pyResToolbox v3.0.4. The following table shows coverage of the major v3 features announced in the v3 release post:

v3 Feature

MCP Coverage

Details

Nodal Analysis - 4 VLP correlations (WG, HB, BB, Gray)

Full

flowing_bhp, ipr_curve, outflow_curve, operating_point tools with vlp_method parameter

Multi-segment deviated/horizontal completions

Full

WellSegment and Completion classes exposed via segments parameter in nodal tools

Production and injection modes

Full

injection flag on flowing_bhp; generate_vfp_inj_table for injection VLP

GasPVT and OilPVT wrapper classes

Full

Used internally by nodal tools for consistent fluid characterization

VFPPROD/VFPINJ table generation

Full

generate_vfp_prod_table, generate_vfp_inj_table tools

Multi-gas brine (Soreide-Whitson VLE)

Full

soreide_whitson_vle tool with CO₂, H₂S, N₂, H₂ mole fractions

IAPWS-IF97 freshwater density

Full

Handled internally by pyRestToolbox brine functions

Hydrogen-capable gas PVT (BUR/Peng-Robinson)

Full

gas_z_factor with method: BUR and h2 parameter; all gas tools support H₂

Metric unit support

Full

metric: true flag on all tools using Eclipse METRIC conventions

Simulation tables (PVDO/PVDG/PVTO/PVTW)

Full

generate_black_oil_table_og, generate_pvtw_table, black_oil_table tools

Rel perm fitting (Corey, LET, Jerauld)

Full

fit_relative_permeability, fit_relative_permeability_best, evaluate_jerauld, check_let_physical tools

Input validation & proper exceptions

Full

Pydantic models with field constraints on all 108 tools

DCA (Arps, Duong, ratio analysis)

Full

9 DCA tools covering all decline types

Material Balance (gas P/Z, oil Havlena-Odeh)

Full

gas_material_balance, oil_material_balance tools

Functions Not Exposed as MCP Tools

Some pyResToolbox functions are used internally but not exposed as standalone MCP tools:

Function

Reason

GasPVT / OilPVT classes

Used internally by nodal tools; individual PVT tools cover same calculations

darcy_gas

Low-level function; gas_rate_radial / gas_rate_linear provide higher-level access

oil_rs_bub / oil_rs_st / sg_st_gas

Specialized functions covered by oil_solution_gor tool

oil_harmonize_pb_rsb

Covered by oil_harmonize tool

gas_ponz2p

Inverse P/Z lookup; covered by gas_pressure_from_pz tool

brine_props / make_pvtw_table (brine)

Covered by calculate_brine_properties and generate_pvtw_table tools

validate_methods

Internal validation utility


Development

Running Tests

# Quick validation (all 108 tools)
make uv-test
# or
uv run python test_tools.py

# Full pytest suite
uv run pytest

# With coverage report
uv run pytest --cov=pyrestoolbox_mcp --cov-report=html

# Specific test modules
uv run pytest tests/test_oil_tools.py
uv run pytest tests/test_gas_tools.py

See TEST_RESULTS.md for complete validation report.

Running Examples

# Run all examples
make uv-examples

# Run specific example
make uv-example EXAMPLE=basic_usage.py
make uv-example EXAMPLE=gas_well_analysis.py

# Or manually
cd examples
uv run python basic_usage.py

Code Quality

# Format code
uv run black src/ tests/

# Lint
uv run ruff check src/ tests/

# Type checking (if mypy added)
uv run mypy src/

Docker Deployment

# Build image
make docker-build

# Run HTTP server (port 8000)
make docker-up-http

# Run SSE server (port 8001)
make docker-up-sse

# View logs
make docker-logs

# Stop services
make docker-down

See DOCKER.md for complete Docker documentation.

Adding New Tools

See CONTRIBUTING.md for detailed instructions. Quick overview:

  1. Define Pydantic Model in src/pyrestoolbox_mcp/models/

  2. Implement Tool Function in appropriate src/pyrestoolbox_mcp/tools/ file

  3. Register Tool in the module's register_*_tools() function

  4. Add Tests to test_tools.py and appropriate pytest file

  5. Update Documentation in README and examples


Available Calculation Methods

Oil Correlations

Bubble Point Pressure

  • VALMC - Valko & McCain (2003) - Recommended for most applications

  • STAN - Standing (1947) - Classic correlation

  • VELAR - Velarde (1997) - For specific regions

Solution GOR (Rs)

  • VELAR - Velarde (1997)

  • STAN - Standing (1947)

  • VALMC - Valko & McCain (2003)

Formation Volume Factor (Bo)

  • MCAIN - McCain et al. (1988) - Recommended

  • STAN - Standing (1947)

Viscosity

  • BR - Beggs & Robinson (1975)

Gas Correlations

Z-Factor

  • DAK - Dranchuk & Abou-Kassem (1975) - Recommended for hydrocarbon gases

  • HY - Hall & Yarborough (1973) - Fast, good for most conditions

  • WYW - Wang, Ye & Wu (2021) - Reasonably fast

  • BUR - Burgoyne, Nielsen & Stanko (2025) - Universal EOS-based correlation (5-component Peng-Robinson), best for high concentrations of non-hydrocarbons (CO₂, H₂S, N₂, H₂), including pure CO₂ and up to 30%+ hydrogen. Only method supporting H₂. (SPE-229932-MS)

Critical Properties

  • PMC - Piper, McCain & Corredor (1993) - Recommended for hydrocarbon gases

  • SUT - Sutton (1985)

  • BUR - Burgoyne, Nielsen & Stanko (2025) - Universal correlation, best for gases with high non-hydrocarbon content (SPE-229932-MS)

Viscosity

  • LGE - Lee, Gonzalez & Eakin (1966)

Relative Permeability

Curve Types

  • COR - Corey (1954) - Power law, simple

  • LET - Lomeland, Ebeltoft & Thomas (2005) - Flexible, complex shapes

Table Types

  • SWOF - Water-oil saturation functions

  • SGOF - Gas-oil saturation functions

  • SGWFN - Gas-water saturation functions (3-phase)


Programmatic Usage

While this server is designed for Claude Desktop integration, you can also use it programmatically:

Python Client

import asyncio
from fastmcp.client import InMemoryTransport
from pyrestoolbox_mcp import mcp

async def calculate_pvt():
    transport = InMemoryTransport(mcp)

    async with transport.get_client() as client:
        # Calculate bubble point
        pb_result = await client.call_tool(
            "oil_bubble_point",
            {
                "api": 35.0,
                "degf": 180.0,
                "rsb": 800.0,
                "sg_g": 0.75,
                "method": "VALMC"
            }
        )
        pb = pb_result['value']
        print(f"Bubble Point: {pb:.2f} psia")

        # Calculate Rs at multiple pressures
        rs_result = await client.call_tool(
            "oil_solution_gor",
            {
                "api": 35.0,
                "degf": 180.0,
                "p": [1000, 2000, 3000, pb, 4000],
                "sg_g": 0.75,
                "pb": pb,
                "rsb": 800.0,
                "method": "VELAR"
            }
        )
        print(f"Rs values: {rs_result['value']}")

        # Access configuration resources
        methods = await client.read_resource("config://methods")
        print(f"Available methods:\n{methods.content}")

asyncio.run(calculate_pvt())

HTTP/SSE Transport

# Start HTTP server
uv run fastmcp run server.py --transport http --port 8000

# Or using Docker
docker-compose --profile http up -d

Then connect using any MCP client or HTTP client supporting the MCP protocol.


Troubleshooting

Installation Issues

"uv: command not found"

  • Close and reopen terminal after installing UV

  • Verify: uv --version

  • Alternative: Use pip instead (pip install -e .)

"make: command not found" (Windows)

  • Use manual commands from Makefile

  • Or install Make for Windows via Chocolatey: choco install make

UV sync fails

  • Clear cache: rm -rf .venv && make uv-install

  • Check Python version: python --version (needs 3.10+)

Claude Desktop Integration

Error: "spawn uv ENOENT"

  • This means Claude Desktop cannot find the uv command

  • GUI applications don't inherit your terminal's PATH

  • Solution: Use absolute path to uv in your config

  • Find UV path: which uv (macOS/Linux) or Get-Command uv (Windows)

  • Common locations:

    • macOS/Linux: /Users/username/.local/bin/uv or /home/username/.local/bin/uv

    • Windows: C:\Users\username\.cargo\bin\uv.exe

Claude doesn't see the tools

  1. Use absolute paths for both uv command and project directory (no ~, use full path)

  2. Verify paths are correct: ls /path/to/uv and ls /path/to/pyrestoolbox-mcp

  3. Completely restart Claude Desktop (Quit, not just close window)

  4. Check Claude Desktop logs:

    • macOS: ~/Library/Logs/Claude/

    • Windows: %APPDATA%\Claude\logs\

    • Linux: ~/.config/Claude/logs/

  5. Test server manually: cd /path/to/pyrestoolbox-mcp && make uv-server

Tools fail with errors

  • Verify all inputs use Field Units (psia, °F, ft, mD)

  • Check parameter names match exactly (case-sensitive)

  • Run validation: uv run python test_tools.py

Runtime Issues

Import errors

# Reinstall dependencies
make uv-install
# or
uv sync --force

Calculation errors

  • Check units (must be psia, °F, etc.)

  • Verify inputs are realistic (e.g., API 10-50, temperatures 60-300°F)

  • Some correlations have valid ranges - try different methods

  • Check pyResToolbox docs for correlation limits

Performance issues

  • Array calculations are optimized via numpy

  • For large datasets, consider batching requests

  • Docker deployment adds minimal overhead

Getting Help


Contributing

Contributions are welcome! This project follows the GPL-3.0 license of the upstream pyResToolbox library.

How to Contribute

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Make your changes (follow code style guidelines)

  4. Test thoroughly (uv run pytest - all tests must pass)

  5. Format code (uv run black src/ tests/)

  6. Commit (git commit -m 'Add amazing feature')

  7. Push (git push origin feature/amazing-feature)

  8. Open a Pull Request

Development Setup

git clone https://github.com/gabrielserrao/pyrestoolbox-mcp.git
cd pyrestoolbox-mcp
make uv-install
uv run python test_tools.py  # Verify all 108 tools pass

Guidelines

  • Use type hints for all function parameters and return values

  • Write Google-style docstrings

  • Add tests for all new tools

  • Follow existing code structure

  • Update documentation

See CONTRIBUTING.md for detailed guidelines.


License

GNU General Public License v3.0 (GPL-3.0)

This MCP server is built on pyResToolbox, which is licensed under GPL-3.0. This project maintains full compliance with GPL-3.0 license terms.

Key Points:

  • Free and open source software

  • You may use, modify, and distribute under GPL-3.0 terms

  • Any modifications must also be released under GPL-3.0

  • No warranty provided (see LICENSE for details)

  • Commercial use is permitted under GPL-3.0 terms

See LICENSE for complete license text.


Project Status

Aspect

Status

Details

Tests

Tests

100% tool coverage

Production

✅ Ready

All tools validated

Documentation

✅ Complete

README, examples, guides

License

GPL-3.0

Matches upstream

Python

3.10+

Type hints throughout

Framework

FastMCP 3.1+

Modern MCP implementation

See PRODUCTION_READY.md for detailed verification results.

Version History

v2.0.0 (2026-03-11) - Major upgrade to pyResToolbox 3.0.4

  • 108 production-ready tools (up from 47)

  • Dual unit support (Field + Metric)

  • New modules: DCA, Material Balance, Nodal Analysis, Geomechanics, Sensitivity, Recommend

  • FastMCP 3.x compatibility

  • 52 pytest tests passing

v1.0.0 (2024-11-15) - Initial production release

  • 47 production-ready tools

  • Docker deployment support

  • GPL-3.0 license compliance

See CHANGELOG.md for detailed version history.


Roadmap

Planned Features

  • Web UI for HTTP transport with interactive forms

  • Additional workflow examples for common tasks

  • Performance benchmarking suite

  • Extended simulation tools (grid processing, ECLIPSE utilities)

  • Jupyter notebook integration with examples

  • API documentation site (Sphinx/MkDocs)

  • Rate limiting and authentication for HTTP deployments

  • Prometheus metrics export

See open issues for full list of proposed features and known issues.

Upstream Integration

We're exploring opportunities to contribute improvements back to pyResToolbox, including:

  • Standalone gas_grad2sg implementation (bug fix)

  • Enhanced type hints

  • Additional validation utilities


Core Dependencies

Similar MCP Servers

Petroleum Engineering Tools

  • PVTpy - PVT calculations in Python

  • petbox - Petroleum engineering toolbox


Acknowledgments

This project wouldn't exist without:

  • Mark Burgoyne - Creator of pyResToolbox, the foundation of this MCP server

  • Marvin AI Team - Developers of FastMCP framework

  • Anthropic - For Claude and the Model Context Protocol specification

  • The reservoir engineering community - For developing and refining the correlations implemented in this project

Special thanks to all contributors who help improve this project!


Citation

If you use this MCP server in academic or commercial work, please cite the original pyResToolbox library:

@software{pyrestoolbox,
  author = {Burgoyne, Mark W.},
  title = {pyResToolbox: A Collection of Reservoir Engineering Utilities},
  url = {https://github.com/mwburgoyne/pyResToolbox},
  version = {3.0.4},
  year = {2025}
}

For this MCP server:

@software{pyrestoolbox_mcp,
  author = {Serrao, Gabriel},
  title = {pyResToolbox MCP Server: AI-Powered Reservoir Engineering Calculations},
  url = {https://github.com/gabrielserrao/pyrestoolbox-mcp},
  version = {2.0.0},
  year = {2026},
  note = {Built on pyResToolbox by Mark W. Burgoyne}
}

Support

Getting Help

For MCP server issues:

For calculation accuracy or pyResToolbox features:

For FastMCP framework:

For Model Context Protocol:

Community


Support & Star

⭐ Star This Project

If you find this project useful, please give it a star on GitHub! Stars help others discover this project and motivate continued development.

☕ Buy Me a Coffee

Support the development and maintenance of this project:

Your support helps keep this project free and open source for the petroleum engineering community!

📈 Star History

Star History Chart



Built with ❤️ for the petroleum engineering community

Created by Gabriel Serrao


Report Bug · Request Feature · Documentation · Examples

GitHub Stars LinkedIn Buy Me A Coffee

Available Tools

45 tools
beta_to_lorenzA

Convert Dykstra-Parsons beta to Lorenz coefficient.

HETEROGENEITY CONVERSION - Converts beta parameter to Lorenz coefficient. Essential for converting literature data and comparing reservoirs using different heterogeneity metrics.

Parameters:

  • value (float, required): Dykstra-Parsons beta coefficient (0-1). Must be 0 ≤ β ≤ 1. Typical: 0.3-0.8. Example: 0.6 for moderate heterogeneity.

Dykstra-Parsons Beta (β):

  • Permeability variation coefficient (dimensionless, 0-1)

  • β = (k50 - k84.1) / k50

  • Based on log-normal permeability distribution

  • Requires permeability data (core, logs)

  • Common in literature and older studies

Lorenz Coefficient (L):

  • Ranges from 0 (homogeneous) to 1 (completely heterogeneous)

  • Based on cumulative flow capacity vs cumulative storage capacity

  • Directly measurable from production data

  • More intuitive for production analysis

Typical Ranges:

  • β < 0.5: Low heterogeneity (L ~ 0.2-0.3)

  • β = 0.5-0.7: Moderate (L ~ 0.3-0.5)

  • β > 0.7: High heterogeneity (L > 0.5)

Use Cases:

  • Literature Conversion: Convert published beta values to Lorenz

  • Reservoir Comparison: Compare reservoirs using different metrics

  • Simulation Input: Convert beta to Lorenz for simulation models

  • Reservoir Analog Studies: Use analog beta values with Lorenz-based tools

  • Historical Data: Convert old Dykstra-Parsons studies to modern metrics

Returns: Dictionary with:

  • lorenz_coefficient (float): Lorenz coefficient (0-1)

  • beta (float): Input beta coefficient

  • method (str): "Dykstra-Parsons to Lorenz conversion"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Beta coefficient outside valid range (must be 0-1)

  • Confusing beta with other variation coefficients

  • Using beta from wrong distribution (must be log-normal)

  • Not understanding that conversion is approximate (depends on distribution)

Example Usage:

{
    "value": 0.6
}

Result: L ≈ 0.4-0.5 (moderate heterogeneity).

Note: Conversion assumes log-normal permeability distribution. For non-log-normal distributions, conversion may be less accurate. Always validate against actual production data when possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the tool's behavior: it performs a mathematical conversion (not destructive), handles input validation (beta must be 0-1), returns a dictionary with specific fields, and notes accuracy limitations (approximate, depends on distribution). However, it lacks details on error handling or performance aspects like rate limits, leaving minor gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (e.g., Parameters, Use Cases, Returns), but it is verbose with extensive background information (e.g., definitions of beta and Lorenz coefficients, typical ranges) that, while informative, could be condensed. Some sentences, like detailed explanations of beta and Lorenz, may not be essential for tool invocation, reducing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (mathematical conversion with accuracy caveats), no annotations, and an output schema (implied by the Returns section), the description is highly complete. It covers purpose, usage, parameters, returns, common mistakes, example usage, and notes on assumptions, providing all necessary context for an AI agent to use the tool correctly without relying on structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must fully compensate. It provides extensive parameter semantics: defines 'value' as the Dykstra-Parsons beta coefficient (0-1), explains its calculation (β = (k50 - k84.1) / k50), gives typical ranges (0.3-0.8), and includes an example (0.6). This adds significant meaning beyond the bare schema, fully documenting the single parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Convert Dykstra-Parsons beta to Lorenz coefficient.' It specifies the exact conversion (beta→Lorenz), distinguishes it from its sibling 'lorenz_to_beta' (reverse conversion), and provides context about heterogeneity metrics, making the purpose specific and differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly outlines when to use this tool in the 'Use Cases' section, including literature conversion, reservoir comparison, simulation input, analog studies, and historical data conversion. It also distinguishes it from alternatives by noting that conversion assumes log-normal permeability distribution and may be less accurate for non-log-normal cases, providing clear guidance on applicability.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calculate_brine_propertiesA

Calculate properties of CH4 or CO2 saturated brine.

BRINE PVT TOOL - Computes comprehensive brine properties including density, viscosity, compressibility, and formation volume factor. Essential for aquifer analysis, water injection, and CO2 sequestration studies.

Parameters:

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3000.0 or [1000, 2000, 3000].

  • degf (float, required): Temperature in °F. Valid: -460 to 1000. Typical: 100-400°F. Example: 180.0.

  • wt (float, required): Salinity in weight percent NaCl (0-30). Typical: 0-20 wt%. Example: 5.0 for 5% NaCl brine.

  • ch4 (float, optional, default=0.0): CH4 saturation fraction (0-1). Typical: 0-0.1. Example: 0.05 for 5% CH4 saturation.

  • co2 (float, optional, default=0.0): CO2 saturation fraction (0-1). Typical: 0-0.1. Example: 0.03 for 3% CO2 saturation.

Properties Calculated:

  • Density (ρw): Brine density in lb/cuft. Increases with salinity, pressure. Typical: 60-70 lb/cuft.

  • Viscosity (μw): Brine viscosity in cP. Decreases with temperature, increases with salinity. Typical: 0.3-1.5 cP.

  • Compressibility (cw): Brine compressibility in 1/psi. Critical for aquifer influx. Typical: 2e-6 to 5e-6 1/psi.

  • Formation Volume Factor (Bw): Volume ratio rb/stb. Slightly > 1.0. Typical: 1.01-1.05 rb/stb.

  • Solution GOR (Rw): Gas dissolved in brine in scf/stb. Increases with pressure. Typical: 0-20 scf/stb.

Dissolved Gas Effects:

  • CH4-saturated: Methane dissolved in formation water (typical in aquifers)

  • CO2-saturated: CO2 dissolution (sequestration, EOR, geothermal)

  • Mixed systems supported (CH4 + CO2)

  • Dissolved gas reduces density and increases compressibility

Salinity Range: 0-30 wt% NaCl (fresh water to highly saline)

  • Fresh water: 0 wt%

  • Brackish: 0.1-1 wt%

  • Seawater: ~3.5 wt%

  • Formation brine: 5-20 wt%

  • Highly saline: 20-30 wt%

Correlations: Uses industry-standard correlations accounting for:

  • Pressure effects on density and viscosity

  • Temperature effects (viscosity decreases with T)

  • Salinity variations (density and viscosity increase with salinity)

  • Dissolved gas concentrations (reduces density)

Applications:

  • Aquifer Influx: Calculate water influx rates and volumes

  • Water Injection: Design injection projects and pressure maintenance

  • CO2 Sequestration: Evaluate CO2 storage capacity and brine properties

  • Geothermal Reservoirs: Analyze geothermal brine properties

  • Pressure Maintenance: Evaluate aquifer pressure support

  • Material Balance: Include water drive in material balance calculations

Returns: Dictionary with:

  • formation_volume_factor_rb_stb (float or list): Bw (matches input p shape)

  • density_lb_cuft (float or list): Brine density (matches input p shape)

  • viscosity_cp (float or list): Brine viscosity (matches input p shape)

  • compressibility_1_psi (float or list): Brine compressibility (matches input p shape)

  • solution_gor_scf_stb (float or list): Gas dissolved in brine (matches input p shape)

  • method (str): "Industry standard correlations"

  • salinity_wt_percent (float): Input salinity

  • dissolved_gas_saturation (float): Combined CH4+CO2 saturation

  • note (str): Usage guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Salinity in ppm instead of wt% (must convert: wt% = ppm/10000)

  • Not accounting for dissolved gas (affects density and compressibility)

  • Temperature in Celsius instead of Fahrenheit

  • Confusing CH4 and CO2 saturation fractions

Example Usage:

{
    "p": [1000, 2000, 3000],
    "degf": 180.0,
    "wt": 5.0,
    "ch4": 0.05,
    "co2": 0.0
}

Result: Brine density increases with pressure, viscosity decreases with temperature. Dissolved CH4 reduces density compared to pure brine.

Note: Brine properties are critical for accurate aquifer modeling. Always account for dissolved gas (CH4 or CO2) as it significantly affects density and compressibility. Salinity has major impact on density and viscosity - use correct formation water salinity.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes what the tool does (computes comprehensive brine properties), mentions it uses industry-standard correlations, and includes practical details like common mistakes (e.g., unit conversions, temperature types) and effects of dissolved gases. However, it lacks explicit information on rate limits, error handling, or computational constraints, which slightly limits transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections like Parameters, Properties Calculated, Applications, and Returns, but it is overly verbose with redundant details (e.g., extensive lists of properties and applications). Some sentences could be condensed without losing clarity, making it less front-loaded and efficient than ideal for an AI agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool (calculating multiple brine properties with gas saturation effects), no annotations, and an output schema that documents return values, the description is highly complete. It covers purpose, parameters, behavior, applications, common mistakes, and example usage, providing all necessary context for an agent to use the tool effectively without relying on structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate. It provides detailed parameter semantics beyond the schema, including units (psia, °F, wt%), valid ranges (e.g., p > 0, degf -460 to 1000, wt 0-30), typical values, examples, and explanations of effects (e.g., salinity increases density). This adds significant value over the minimal schema information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool calculates properties of CH4 or CO2 saturated brine, listing specific properties (density, viscosity, compressibility, formation volume factor) and distinguishing it from sibling tools like 'gas_density' or 'oil_density' by focusing on brine with dissolved gases. It uses clear verbs ('calculate', 'computes') and specifies the resource ('brine properties').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool, listing applications such as aquifer analysis, water injection, CO2 sequestration, geothermal reservoirs, pressure maintenance, and material balance calculations. It also distinguishes usage from potential alternatives by specifying it's for brine (not gas or oil) and includes dissolved gas effects, with no misleading or contradictory information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

co2_brine_mutual_solubilityA

Calculate CO2-brine mutual solubilities and properties.

CRITICAL CO2-BRINE SYSTEM TOOL - Computes comprehensive properties for CO2-saturated brine systems using the Duan & Sun (2003) model. Essential for CO2 sequestration, CO2-EOR, and geothermal applications. Accounts for mutual solubility (CO2 in brine, H2O in CO2-rich phase).

Parameters:

  • pres (float, required): Pressure in psia (field) or bar (metric). Must be > 0. Typical: 1000-5000 psia. Example: 3000.0 psia.

  • temp (float, required): Temperature in °F (field) or °C (metric). Typical: 100-400°F. Example: 180.0°F.

  • ppm (float, required): Salinity in parts per million (ppm) NaCl. Typical: 0-200000 ppm. Example: 50000 ppm (5 wt%).

  • metric (bool, optional, default=False): Unit system flag. False = field units (psia, °F), True = metric (bar, °C).

  • cw_sat (bool, optional, default=True): Compressibility calculation flag. True = saturated compressibility, False = undersaturated.

Properties Calculated:

  • Phase Equilibrium:

    • Aqueous phase mole fractions (x_CO2, x_H2O)

    • Vapor phase mole fractions (y_CO2, y_H2O)

    • Salt mole fraction

  • Densities:

    • CO2-rich gas density (gm/cm³)

    • Brine CO2-saturated density (gm/cm³)

    • Brine pure density (gm/cm³)

    • Fresh water density (gm/cm³)

  • Viscosities:

    • Brine CO2-saturated viscosity (cP)

    • Brine pure viscosity (cP)

    • Fresh water viscosity (cP)

  • Formation Volume Factors:

    • Bw CO2-saturated (rb/stb)

    • Bw pure (rb/stb)

    • Bw fresh (rb/stb)

  • Compressibility:

    • Undersaturated compressibility (1/psi or 1/bar)

    • Saturated compressibility (1/psi or 1/bar)

  • Solution GOR: CO2 dissolved in brine (scf/stb or m³/m³)

Mutual Solubility: CO2-brine systems exhibit mutual solubility:

  • CO2 dissolves in brine (increases with pressure, decreases with salinity)

  • H2O dissolves in CO2-rich phase (increases with temperature)

  • Both solubilities depend on pressure, temperature, and salinity

Physics: Uses Duan & Sun (2003) model for CO2-H2O-NaCl systems accounting for:

  • Pressure effects on solubility (higher P = more CO2 dissolved)

  • Temperature effects (higher T = less CO2 dissolved, more H2O in vapor)

  • Salinity effects (higher salinity = less CO2 dissolved)

  • Mutual solubility (both phases contain both components)

Applications:

  • CO2 Sequestration: CCS project design, storage capacity evaluation

  • CO2-EOR: Enhanced oil recovery with CO2 injection, miscibility studies

  • Geothermal: CO2-based geothermal systems, supercritical CO2

  • Aquifer Storage: Underground CO2 storage capacity, leakage assessment

  • Material Balance: CO2-brine material balance calculations

Salinity Conversion:

  • 1 wt% = 10,000 ppm

  • Seawater ≈ 35,000 ppm (3.5 wt%)

  • Formation brine: 50,000-200,000 ppm (5-20 wt%)

Returns: Dictionary with:

  • phase_equilibrium (dict): Mole fractions in aqueous and vapor phases

  • densities (dict): All density values (CO2-rich, saturated, pure, fresh)

  • viscosities (dict): All viscosity values (saturated, pure, fresh)

  • formation_volume_factors (dict): Bw values (saturated, pure, fresh)

  • compressibility (dict): Undersaturated and saturated compressibility

  • solution_gor_co2 (float): CO2 dissolved in brine

  • viscosibility_per_bar_or_psi (float): Viscosibility coefficient

  • method (str): "Duan & Sun (2003) CO2-H2O-NaCl model"

  • units (str): "metric" or "field"

  • note (str): Usage guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using wrong unit system (check metric flag)

  • Salinity in wt% instead of ppm (must convert: ppm = wt% × 10000)

  • Pressure in barg/psig instead of psia (must be absolute)

  • Temperature in wrong units (check metric flag)

  • Not accounting for mutual solubility (both phases contain both components)

  • Using wrong compressibility (saturated vs undersaturated)

Example Usage (Field Units):

{
    "pres": 3000.0,
    "temp": 180.0,
    "ppm": 50000,
    "metric": False,
    "cw_sat": True
}

Result: CO2 solubility in brine ≈ 20-40 scf/stb, H2O in CO2-rich phase ≈ 0.1-1 mol%.

Note: CO2-brine mutual solubility is critical for CCS and CO2-EOR projects. Always use correct unit system (field vs metric). The model accounts for mutual solubility which is significant at high pressures and temperatures. Salinity significantly reduces CO2 solubility - use correct formation water salinity.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains the tool's behavior: it computes comprehensive properties, uses a specific model (Duan & Sun 2003), accounts for mutual solubility, handles unit systems, includes physics effects (pressure, temperature, salinity), and returns a detailed dictionary. It also notes critical applications and common pitfalls, providing rich behavioral context beyond basic functionality.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Properties Calculated, Applications, Returns, Common Mistakes), but it is lengthy with some redundancy (e.g., repeating mutual solubility details). Every sentence adds value, but it could be more front-loaded; the core purpose is stated early, but extensive details follow. It's efficient for a complex tool but slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, no annotations, and an output schema (implied by 'Returns' section), the description is highly complete. It covers purpose, parameters, physics, applications, returns, common mistakes, and example usage. The output schema is described in detail in the 'Returns' section, making it fully adequate for an agent to understand and use the tool effectively in context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate. It provides detailed parameter semantics: pres (pressure in psia/bar with typical ranges), temp (temperature in °F/°C with typical ranges), ppm (salinity in ppm with conversion examples), metric (unit system flag), and cw_sat (compressibility calculation flag). Each parameter includes units, constraints, examples, and practical guidance, adding significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool calculates CO2-brine mutual solubilities and properties using the Duan & Sun (2003) model, specifying the verb 'calculate' and resource 'CO2-brine mutual solubilities and properties'. It distinguishes from siblings like 'calculate_brine_properties' by focusing specifically on CO2-brine systems with mutual solubility, making it highly specific and differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool for CO2 sequestration, CO2-EOR, geothermal applications, aquifer storage, and material balance calculations. It includes a 'Common Mistakes' section with warnings about unit systems, salinity conversion, and compressibility flags, offering clear when-to-use and when-not-to-use advice without naming specific alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

evolved_gas_sgA

Calculate evolved gas specific gravity.

Computes the specific gravity of gas evolved from oil as pressure decreases below bubble point. This is important for:

  • Material balance calculations

  • Surface facility design

  • Gas sales forecasting

The evolved gas composition changes with pressure, and this function accounts for that variation.

Returns dimensionless specific gravity (air = 1.0).

Args: request: Evolved gas parameters including oil properties, pressure(s), and separator conditions

Returns: Dictionary with evolved gas SG value(s), units, and inputs

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool 'computes' and 'returns' values, implying a read-only calculation, and mentions that 'evolved gas composition changes with pressure' which adds useful behavioral context. However, it lacks details on error handling, performance, or limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, usage contexts, behavioral note, and return details. It is appropriately sized, though the bulleted list of applications could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a physics-based calculation with 1 parameter (a nested object) and an output schema, the description is reasonably complete. It explains the tool's purpose, usage, key behavioral aspect (pressure variation), and return format, though it could benefit from more detail on input constraints or examples.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must compensate. It adds significant meaning beyond the schema by explaining that parameters include 'oil properties, pressure(s), and separator conditions', clarifying the purpose of the nested 'request' object and its role in the calculation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Calculate evolved gas specific gravity') and resource ('gas evolved from oil as pressure decreases below bubble point'), distinguishing it from siblings like 'gas_sg_from_composition' or 'weighted_average_gas_sg' by focusing on pressure-dependent evolution from oil.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool ('for material balance calculations, surface facility design, gas sales forecasting' and 'when pressure decreases below bubble point'), but does not explicitly state when not to use it or name alternative tools among the siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_eclipse_problem_cellsA

Extract convergence problem cells from ECLIPSE/Intersect PRT file.

SIMULATION DIAGNOSTICS TOOL - Parse ECLIPSE/Intersect PRT output files to extract cells with convergence failures, material balance errors, or other simulation problems.

What It Does:

  • Scans ECLIPSE .PRT files for error/warning messages

  • Identifies problem cells by (I, J, K) grid coordinates

  • Extracts timestep and iteration information

  • Reports error types and severity

Applications:

  • Convergence Debugging: Find cells causing timestep cuts

  • Model QC: Identify grid initialization issues

  • Performance Tuning: Locate problematic regions

  • Numerical Stability: Track material balance errors

Common Problems Detected:

  • Material balance errors

  • Negative saturations

  • Pressure/temperature out of range

  • Flash calculation failures

  • Linear solver issues

  • Severe saturation changes

Workflow:

  1. Run ECLIPSE/Intersect simulation

  2. Locate the .PRT output file

  3. Use this tool to extract problem cell locations

  4. Investigate problematic cells in pre-processor

  5. Refine initialization or grid properties

Output Format: List of problem cells with timestep, iteration, cell coordinates (I,J,K), error type, and severity.

Args: request: Path to PRT file and output options

Returns: Dictionary with list of problem cells and summary statistics

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It effectively describes what the tool does (e.g., scans files, extracts data, reports errors) and the output format. However, it lacks details on error handling, performance characteristics, or any limitations (e.g., file size constraints), which prevents a perfect score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (e.g., 'What It Does', 'Applications', 'Workflow'), making it easy to scan. However, it includes some redundancy (e.g., repeating tool purpose in multiple sections) and could be more concise by trimming less critical details without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool (simulation diagnostics), no annotations, and an output schema present, the description is mostly complete. It covers purpose, usage, applications, and output format. However, it lacks details on potential errors or edge cases, which would enhance completeness for such a specialized tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions 'Path to PRT file and output options' in the Args section, which aligns with the 'filename' parameter in the schema. However, it does not detail the 'silent' parameter or provide additional semantic context beyond what is minimally implied, resulting in a baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verbs ('extract', 'parse', 'scans', 'identifies') and resources ('convergence problem cells', 'ECLIPSE/Intersect PRT files'). It distinguishes itself from sibling tools by focusing on simulation diagnostics and problem cell extraction, unlike the sibling tools which are primarily for fluid properties, calculations, and validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides usage guidelines through sections like 'Applications' (e.g., 'Convergence Debugging', 'Model QC', 'Performance Tuning', 'Numerical Stability') and 'Workflow' (a 5-step process). It clearly indicates when to use this tool—for analyzing simulation output files to debug issues—without needing to specify alternatives, as sibling tools serve different purposes (e.g., fluid property calculations).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

flow_fractions_from_lorenzA

Generate flow fractions from Lorenz coefficient.

SYNTHETIC FLOW PROFILE - Creates idealized flow distribution matching a specified Lorenz coefficient. Generates a Lorenz curve (cumulative flow vs cumulative capacity) that honors the target heterogeneity level.

Parameters:

  • value (float, required): Target Lorenz coefficient (0-1). Must be 0 ≤ L ≤ 1. Typical: 0.2-0.7. Example: 0.5 for moderate heterogeneity.

Lorenz Curve Generation: Creates a curve showing:

  • X-axis: Cumulative storage capacity (kh fraction)

  • Y-axis: Cumulative flow capacity (flow fraction)

  • Curve shape: Determined by Lorenz coefficient

  • Points: 20 points along the curve for visualization

Curve Behavior:

  • L = 0: Straight diagonal line (perfect conformance)

  • L > 0: Curved line below diagonal (flow imbalance)

  • Higher L: More curvature, greater flow imbalance

Applications:

  • Reservoir Simulation: Generate layer properties for simulation models

  • Waterflood Prediction: Predict sweep efficiency from heterogeneity

  • Sweep Efficiency Estimation: Estimate vertical sweep from Lorenz

  • Sensitivity Analysis: Test impact of heterogeneity on performance

  • Conceptual Models: Create idealized reservoir models for studies

  • Visualization: Plot Lorenz curve to visualize heterogeneity

Returns: Dictionary with:

  • cumulative_flow_capacity (list): Y-axis values (cumulative flow fractions)

  • cumulative_storage_capacity (list): X-axis values (cumulative kh fractions)

  • lorenz_coefficient (float): Target Lorenz coefficient

  • method (str): "Generated Lorenz curve"

  • note (str): Visualization guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Lorenz coefficient outside valid range (must be 0-1)

  • Confusing cumulative fractions with incremental fractions

  • Not understanding that curve represents idealized distribution

  • Using curve for non-log-normal distributions (may be inaccurate)

Example Usage:

{
    "value": 0.5
}

Result: Lorenz curve with 20 points showing cumulative flow vs cumulative capacity. Curve is below diagonal, indicating flow imbalance (high-k layers produce more than their capacity fraction).

Note: This generates an idealized Lorenz curve. For actual reservoirs, use lorenz_from_flow_fractions with measured production data. The curve assumes log-normal permeability distribution. Plot cumulative flow vs cumulative storage to visualize heterogeneity.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and delivers comprehensive behavioral information. It explains what the tool creates (idealized flow distribution, Lorenz curve with 20 points), curve behavior for different L values, assumptions (log-normal permeability distribution), limitations (may be inaccurate for non-log-normal distributions), and detailed return structure. It also warns about common mistakes like invalid coefficient ranges.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (SYNTHETIC FLOW PROFILE, Parameters, Lorenz Curve Generation, etc.) and front-loads the core purpose. While comprehensive, some sections like 'Applications' with 6 bullet points could be more concise. However, every sentence adds value and there's no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (generating mathematical curves with specific behavior), no annotations, and 0% schema coverage, the description provides exceptional completeness. It covers purpose, usage, parameters, behavior, applications, returns, common mistakes, examples, and limitations. The existence of an output schema means the description doesn't need to fully document return values, but it still provides a helpful summary of the return dictionary structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage (schema only has 'value' with type/number and min/max constraints), the description fully compensates by providing rich parameter semantics. It explains the parameter is a 'Target Lorenz coefficient (0-1)', provides typical range (0.2-0.7), gives an example (0.5), explains what different values represent (L=0 perfect conformance, L>0 flow imbalance), and shows example usage. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Generate flow fractions from Lorenz coefficient' and 'Creates idealized flow distribution matching a specified Lorenz coefficient.' It distinguishes from sibling 'lorenz_from_flow_fractions' by specifying this tool generates synthetic data while that tool works with measured data. The verb 'generate' and resource 'flow fractions' are specific and well-defined.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool versus alternatives. It states: 'For actual reservoirs, use `lorenz_from_flow_fractions` with measured production data' and explains this tool is for generating idealized curves. The 'Applications' section further clarifies appropriate use cases like reservoir simulation, waterflood prediction, and sensitivity analysis.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_compressibilityA

Calculate gas compressibility (Cg).

CRITICAL GAS PVT PROPERTY - Computes gas compressibility coefficient, which measures how much gas volume changes with pressure. Essential for material balance calculations, pressure transient analysis, and reserve estimation. Gas compressibility is much higher than oil compressibility (typically 100-1000 × 10⁻⁶ 1/psi vs 5-50 × 10⁻⁶).

Parameters:

  • sg (float, required): Gas specific gravity (air=1.0). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Typical: 100-400°F. Example: 180.0.

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3500.0 or [1000, 2000, 3000, 4000].

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.02.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.05.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.01.

  • zmethod (str, optional, default="DAK"): Z-factor method for compressibility. Options: "DAK", "HY", "WYW", "BUR". DAK recommended.

Compressibility Behavior:

  • Decreases with increasing pressure (gas becomes less compressible)

  • Typical range: 50-500 × 10⁻⁶ 1/psi at reservoir conditions

  • At low pressure: Cg ≈ 1/P (ideal gas behavior)

  • At high pressure: Cg decreases significantly

Formula: Cg = (1/Z) × (∂Z/∂P) - (1/P)

Where Z-factor and its pressure derivative are calculated using specified method.

Returns: Dictionary with:

  • value (float or list): Compressibility in 1/psi (matches input p shape)

  • method (str): Z-factor method used

  • units (str): "1/psi"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not accounting for non-hydrocarbon fractions

  • Confusing gas compressibility (high, 100-1000 × 10⁻⁶) with oil compressibility (low, 5-50 × 10⁻⁶)

  • Using ideal gas approximation (Cg = 1/P) instead of real gas

Example Usage:

{
    "sg": 0.7,
    "degf": 180.0,
    "p": [1000, 2000, 3000, 4000],
    "h2s": 0.0,
    "co2": 0.05,
    "n2": 0.01,
    "zmethod": "DAK"
}

Result: Cg decreases from ~1000 × 10⁻⁶ 1/psi at 1000 psia to ~250 × 10⁻⁶ 1/psi at 4000 psia.

Note: Gas compressibility is critical for material balance calculations. Always use reservoir conditions. Account for all non-hydrocarbon components. Cg values are small (micro-1/psi), so results are typically in scientific notation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and excels. It details behavioral traits: the formula used (Cg = (1/Z) × (∂Z/∂P) - (1/P)), how compressibility decreases with pressure, typical ranges (50-500 × 10⁻⁶ 1/psi), ideal gas behavior at low pressure, and the return format (dictionary with value, method, units, inputs).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Compressibility Behavior, Formula, Returns, Common Mistakes, Example Usage, Note) and front-loads the purpose. While comprehensive, it's appropriately sized for a complex tool, though slightly verbose; every sentence adds value, earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, no annotations, and an output schema (which the description aligns with by detailing returns), the description is highly complete. It covers purpose, usage, parameters, behavior, formula, returns, common mistakes, and examples, leaving no gaps for effective tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description fully compensates. It provides detailed semantics for all 7 parameters: purpose (e.g., 'Gas specific gravity'), valid ranges, typical values, examples, optional/default status, and for 'zmethod', it lists options and recommends 'DAK'. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates gas compressibility (Cg), specifying it's a critical PVT property that measures gas volume change with pressure. It distinguishes from sibling tools like 'oil_compressibility' by explicitly contrasting gas vs. oil compressibility ranges (100-1000 × 10⁻⁶ vs 5-50 × 10⁻⁶ 1/psi).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool ('essential for material balance calculations, pressure transient analysis, and reserve estimation') and when not to use it ('confusing gas compressibility with oil compressibility'). It also lists common mistakes to avoid, effectively guiding usage versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_critical_propertiesA

Calculate gas pseudo-critical properties (Tc and Pc).

CRITICAL GAS PROPERTY CALCULATION - Computes pseudo-critical temperature and pressure for real gas mixtures. Required for Z-factor calculations and all gas property correlations. Pseudo-critical properties are weighted averages of pure component critical properties, adjusted for non-hydrocarbon components.

Parameters:

  • sg (float, required): Gas specific gravity (air=1.0). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7 for dry gas.

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.02 for 2% H2S. High H2S significantly affects Tc/Pc.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.05 for 5% CO2.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.01 for 1% N2.

  • method (str, optional, default="PMC"): Correlation method. Options: "PMC", "SUT", "BUR". PMC recommended.

Pseudo-Critical Properties:

  • Tc (Pseudo-critical Temperature): Temperature above which gas cannot be liquefied regardless of pressure. Typical: 300-500°R for natural gas.

  • Pc (Pseudo-critical Pressure): Pressure at critical temperature. Typical: 600-800 psia for natural gas.

Method Selection:

  • PMC (Piper, McCain & Corredor 1993): RECOMMENDED. Most accurate for wide range of gas compositions. Accounts for non-hydrocarbon effects.

  • SUT (Sutton 1985): Classic method. Use for compatibility with older methods.

  • BUR (Burrows 1981): Alternative method. Use for specific applications.

Non-Hydrocarbon Effects:

  • H2S: Increases both Tc and Pc significantly

  • CO2: Increases Tc, decreases Pc slightly

  • N2: Increases Pc, decreases Tc slightly

  • Always account for non-hydrocarbons for accurate Z-factor calculations

Returns: Dictionary with:

  • value (dict): Contains "tc" (degR) and "pc" (psia)

  • method (str): Method used

  • units (dict): {"tc": "degR", "pc": "psia"}

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Not accounting for non-hydrocarbon fractions (H2S, CO2, N2)

  • Using wrong gas gravity (must be separator gas, not sales gas)

  • Confusing pseudo-critical with true critical properties

  • Using critical properties for pure components instead of mixtures

Example Usage:

{
    "sg": 0.7,
    "h2s": 0.0,
    "co2": 0.05,
    "n2": 0.01,
    "method": "PMC"
}

Result: Tc ≈ 380-420°R, Pc ≈ 650-750 psia for typical natural gas.

Note: Critical properties are used internally by gas_z_factor and other gas property tools. Always use PMC method unless specific compatibility required. Account for all non-hydrocarbon components - even small amounts affect results.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it's a calculation tool (non-destructive, read-only implied), explains effects of parameters (e.g., H2S increases Tc/Pc), provides typical ranges and units, and details return structure. It also notes dependencies (used by gas_z_factor) and accuracy considerations (non-hydrocarbon effects).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections (Parameters, Pseudo-Critical Properties, Method Selection, etc.), but slightly verbose (e.g., repeating method details). Every sentence adds value (e.g., explaining non-hydrocarbon effects), though it could be more front-loaded; the core purpose is stated early, but some details are deep in the text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, 0% schema coverage, and an output schema (which the description aligns with by detailing returns), the description is highly complete: it covers purpose, usage, parameters, behavior, outputs, examples, and common pitfalls. It provides all necessary context for a calculation tool with multiple inputs and specific domain requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates fully: it explains each parameter's purpose (e.g., sg for gas specific gravity), valid ranges, typical values, examples, and impacts on results (e.g., high H2S significantly affects Tc/Pc). It also details method options with recommendations, adding meaning beyond basic schema constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates pseudo-critical temperature and pressure for gas mixtures, specifying it's for real gases and required for Z-factor calculations. It distinguishes from siblings by focusing on gas properties (unlike oil or brine tools) and explicitly mentions it's used internally by gas_z_factor, avoiding overlap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidelines are provided: use for Z-factor calculations and gas property correlations, with method recommendations (PMC preferred, SUT for compatibility, BUR for specific apps). It warns against common mistakes like not accounting for non-hydrocarbons or using wrong gas gravity, and notes when to use alternatives (e.g., for pure components vs mixtures).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_densityA

Calculate gas density (ρg) at reservoir conditions.

CRITICAL GAS PVT PROPERTY - Computes gas density from real gas equation of state. Essential for gradient calculations, well pressure analysis, and material balance. Gas density increases significantly with pressure due to compressibility.

Parameters:

  • sg (float, required): Gas specific gravity (air=1.0). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Typical: 100-400°F. Example: 180.0.

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3500.0 or [1000, 2000, 3000, 4000].

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.02.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.05.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.01.

  • zmethod (str, optional, default="DAK"): Z-factor method for density calculation. Options: "DAK", "HY", "WYW", "BUR". DAK recommended.

Density Formula: ρg = (P × MW) / (Z × R × T)

Where:

  • P = pressure (psia)

  • MW = molecular weight = sg × 28.97 lb/lbmol

  • Z = gas compressibility factor

  • R = gas constant = 10.732 psia·ft³/(lbmol·°R)

  • T = temperature (°R = °F + 460)

Density Behavior:

  • Increases with pressure (gas compresses)

  • Decreases with temperature (gas expands)

  • Typical range: 5-20 lb/cuft at reservoir conditions

  • At standard conditions: ~0.05-0.1 lb/cuft

Returns: Dictionary with:

  • value (float or list): Density in lb/cuft (matches input p shape)

  • method (str): Z-factor method used

  • units (str): "lb/cuft"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not accounting for non-hydrocarbon fractions

  • Using ideal gas law (Z=1) instead of real gas (Z<1)

  • Temperature in Celsius instead of Fahrenheit

Example Usage:

{
    "sg": 0.7,
    "degf": 180.0,
    "p": [1000, 2000, 3000, 4000],
    "h2s": 0.0,
    "co2": 0.05,
    "n2": 0.01,
    "zmethod": "DAK"
}

Result: Density increases from ~8 lb/cuft at 1000 psia to ~18 lb/cuft at 4000 psia.

Note: Gas density is much lower than oil density (typically 5-20 lb/cuft vs 40-60 lb/cuft). Always use reservoir conditions. Account for all non-hydrocarbon components - they significantly affect molecular weight and density.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure and excels. It details the density formula, behavior (e.g., 'Increases with pressure', 'Decreases with temperature'), typical ranges, and critical notes on units and conditions. It also warns about common mistakes, providing rich context beyond basic functionality.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections like 'Parameters', 'Density Formula', and 'Common Mistakes', but it is lengthy with some redundant information (e.g., repeating parameter details in the example). While informative, it could be more front-loaded and concise, as not all sentences earn their place equally.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 0% schema description coverage and no annotations, the description is highly complete. It covers purpose, parameters, formula, behavior, returns (though an output schema exists), common mistakes, and example usage. It provides all necessary context for an AI agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Given 0% schema description coverage, the description fully compensates by providing detailed parameter semantics. Each parameter is explained with descriptions, valid ranges, typical values, examples, and optionality. It adds meaning beyond the schema, such as the significance of 'zmethod' options and the impact of non-hydrocarbon fractions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Calculate') and resource ('gas density (ρg) at reservoir conditions'), distinguishing it from siblings like 'oil_density' or 'gas_compressibility'. It emphasizes this as a 'CRITICAL GAS PVT PROPERTY' for specific applications like gradient calculations and material balance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (e.g., 'Essential for gradient calculations, well pressure analysis, and material balance') and includes a 'Common Mistakes' section that implicitly guides usage by highlighting pitfalls. However, it does not explicitly compare to alternatives like 'gas_z_factor' or specify when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_formation_volume_factorA

Calculate gas formation volume factor (Bg).

CRITICAL GAS PVT PROPERTY - Computes ratio of gas volume at reservoir conditions to volume at standard conditions. Bg << 1.0 because gas compresses significantly at reservoir pressure. Essential for material balance, reserve calculations, and production forecasting.

Parameters:

  • sg (float, required): Gas specific gravity (air=1.0). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Typical: 100-400°F. Example: 180.0.

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3500.0 or [1000, 2000, 3000, 4000].

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.02.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.05.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.01.

  • zmethod (str, optional, default="DAK"): Z-factor method for Bg calculation. Options: "DAK", "HY", "WYW", "BUR". DAK recommended.

Bg Behavior:

  • Bg decreases with increasing pressure (gas compresses)

  • Bg increases with increasing temperature (gas expands)

  • Typical range: 0.001-0.01 rcf/scf at reservoir conditions

  • At standard conditions (14.7 psia, 60°F): Bg = 1.0 rcf/scf

Formula: Bg = (Z × T × Psc) / (P × Tsc) = 0.02827 × Z × T / P (field units)

Where:

  • Z = gas compressibility factor (from gas_z_factor tool)

  • T = reservoir temperature (°R)

  • P = reservoir pressure (psia)

  • Psc = 14.7 psia, Tsc = 520°R (standard conditions)

Returns: Dictionary with:

  • value (float or list): Bg in rcf/scf (matches input p shape)

  • method (str): Z-factor method used

  • units (str): "rcf/scf"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not accounting for non-hydrocarbon fractions

  • Confusing Bg (gas FVF) with Bo (oil FVF)

  • Temperature in Celsius instead of Fahrenheit

Example Usage:

{
    "sg": 0.7,
    "degf": 180.0,
    "p": [1000, 2000, 3000, 4000],
    "h2s": 0.0,
    "co2": 0.05,
    "n2": 0.01,
    "zmethod": "DAK"
}

Result: Bg decreases from ~0.005 rcf/scf at 1000 psia to ~0.002 rcf/scf at 4000 psia.

Note: Bg is inversely proportional to pressure. Always use reservoir conditions, not separator conditions. Account for all non-hydrocarbon components for accuracy.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and excels. It explains Bg behavior (decreases with pressure, increases with temperature), typical ranges (0.001-0.01 rcf/scf), formula details, return structure, common mistakes, and critical notes about using reservoir conditions. This provides comprehensive behavioral context beyond basic calculation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Bg Behavior, Formula, Returns, Common Mistakes, Example Usage, Note) and every sentence adds value. While comprehensive, it's appropriately sized for a complex tool with many parameters and no annotations, though slightly lengthy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, 7 parameters with 0% schema coverage, no annotations, but with output schema, the description is exceptionally complete. It covers purpose, parameters, behavior, formula, returns, common mistakes, examples, and critical usage notes, providing everything needed for correct tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by providing detailed parameter information: valid ranges, typical values, examples, optional/default values, and zmethod options. It adds significant meaning beyond the bare schema, including practical guidance like pressure must be absolute (psia) not barg/psig.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates the gas formation volume factor (Bg), specifying it's a critical PVT property that computes the ratio of gas volume at reservoir to standard conditions. It distinguishes from siblings like oil_formation_volume_factor by explicitly mentioning gas-specific behavior and common confusion with oil FVF.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (material balance, reserve calculations, production forecasting) and mentions using the gas_z_factor tool for Z calculations. However, it doesn't explicitly state when NOT to use it or name specific alternative tools among siblings for related calculations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_pressure_from_pzA

Calculate pressure from P/Z value.

MATERIAL BALANCE TOOL - Solves for pressure given a P/Z (pressure/Z-factor) value. Essential for gas material balance analysis where P/Z vs cumulative production is plotted. Uses iterative solution to find pressure that yields the specified P/Z value.

Parameters:

  • pz (float or list, required): P/Z value(s) in psia. Must be > 0. Can be scalar or array. Example: 5000.0 or [4000, 5000, 6000].

  • sg (float, required): Gas specific gravity (air=1.0). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Typical: 100-400°F. Example: 180.0.

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.0.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.0.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.0.

  • zmethod (str, optional, default="DAK"): Z-factor method for calculation. Options: "DAK", "HY", "WYW", "BUR". DAK recommended.

P/Z Method Applications:

  • Volumetric Gas Reserves: P/Z vs Gp plot gives GIIP (Gas Initially In Place)

  • Aquifer Influx Detection: Deviation from straight line indicates water drive

  • Drive Mechanism Identification: Volumetric vs water drive vs gas cap

  • Production Forecasting: Extrapolate P/Z to abandonment pressure

Material Balance Principle: For volumetric gas reservoirs: P/Z = (Pi/Zi) × (1 - Gp/G) Where Gp = cumulative production, G = GIIP

A straight line on P/Z vs Gp indicates volumetric depletion. Deviation suggests water influx, changing pore volume, or gas cap expansion.

Solution Method: Iterative Newton-Raphson method to solve: P/Z - pz_target = 0 Converges rapidly for well-posed problems.

Returns: Dictionary with:

  • value (float or list): Pressure in psia (matches input pz shape)

  • method (str): Iterative solution method with Z-factor method

  • units (str): "psia"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Not accounting for non-hydrocarbon fractions

  • Confusing P/Z (pressure/Z-factor) with pressure

  • Using wrong Z-factor method (must match method used in material balance)

  • Temperature in Celsius instead of Fahrenheit

Example Usage:

{
    "pz": 5000.0,
    "sg": 0.7,
    "degf": 180.0,
    "h2s": 0.0,
    "co2": 0.0,
    "n2": 0.0,
    "zmethod": "DAK"
}

Result: Pressure ≈ 4500-5500 psia (depends on Z-factor at that pressure).

Note: P/Z method is fundamental to gas material balance. Always use the same Z-factor method throughout your analysis for consistency. Account for all non-hydrocarbon components as they affect Z-factor and thus P/Z values.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains the tool's behavior: it uses an 'iterative Newton-Raphson method' to solve for pressure, returns a dictionary with specific keys (value, method, units, inputs), and includes details on convergence ('Converges rapidly for well-posed problems'), error handling (e.g., parameter validity ranges), and consistency requirements (e.g., using the same Z-factor method throughout analysis).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections like Parameters, P/Z Method Applications, Material Balance Principle, Solution Method, Returns, Common Mistakes, and Example Usage, making it easy to navigate. However, it is quite lengthy with extensive theoretical background (e.g., material balance equations), which, while informative, could be trimmed for more front-loaded conciseness without losing essential guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is highly complete for this complex tool with no annotations and an output schema. It covers purpose, usage, parameters, behavior, return values, examples, and common pitfalls. Given the output schema exists (as per context signals), the description appropriately explains the return structure without redundancy, ensuring the agent has all necessary context to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Given the schema description coverage is 0% (as indicated by context signals), the description fully compensates by providing detailed parameter semantics. It lists all parameters (pz, sg, degf, h2s, co2, n2, zmethod) with clear explanations, valid ranges, typical values, examples, and optional/default settings, adding significant meaning beyond the bare schema properties and required fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculate pressure from P/Z value' and 'Solves for pressure given a P/Z (pressure/Z-factor) value.' It specifically distinguishes this as a 'MATERIAL BALANCE TOOL' for gas material balance analysis, differentiating it from sibling tools like gas_z_factor or gas_critical_properties by focusing on iterative pressure calculation from P/Z inputs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: 'Essential for gas material balance analysis where P/Z vs cumulative production is plotted.' It details applications such as volumetric gas reserves, aquifer influx detection, drive mechanism identification, and production forecasting, and warns against common mistakes like using separator temperature or wrong Z-factor methods, offering clear context for proper usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_pseudopressureA

Calculate gas pseudopressure difference (m(p)).

CRITICAL GAS ANALYSIS TOOL - Computes pseudopressure difference, a pressure transformation that linearizes the gas diffusivity equation. This makes gas flow analysis mathematically similar to liquid flow, enabling use of liquid flow solutions for gas systems. Essential for accurate gas well performance analysis.

Parameters:

  • sg (float, required): Gas specific gravity (air=1.0). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Typical: 100-400°F. Example: 180.0.

  • p1 (float, required): Initial pressure in psia. Must be > 0. Typically reservoir pressure. Example: 1000.0.

  • p2 (float, required): Final pressure in psia. Must be > 0. Typically sandface pressure. Example: 3500.0.

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.0.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.0.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.0.

  • zmethod (str, optional, default="DAK"): Z-factor method for integration. Options: "DAK", "HY", "WYW", "BUR". DAK recommended.

Pseudopressure Formula: m(p) = 2∫(p/(μZ))dp from p1 to p2

Where:

  • p = pressure (psia)

  • μ = gas viscosity (cP)

  • Z = gas compressibility factor

Why Pseudopressure: Gas properties (Z, μ) vary significantly with pressure, making gas flow non-linear. Pseudopressure transformation accounts for these variations, enabling:

  • Use of liquid flow solutions for gas

  • Linear pressure analysis

  • Accurate well test interpretation

  • Material balance calculations

Applications:

  • Gas Well Testing: Pressure transient analysis, rate transient analysis

  • Material Balance: P/Z vs cumulative production plots

  • Reservoir Simulation: Input for gas flow calculations

  • IPR Curves: Inflow performance relationship generation

Returns: Dictionary with:

  • value (float): Pseudopressure difference in psia²/cP

  • method (str): Integration method with Z-factor method used

  • units (str): "psia²/cP"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not accounting for non-hydrocarbon fractions

  • Confusing pseudopressure with actual pressure

  • Using wrong pressure order (p1 should be lower than p2 typically)

  • Temperature in Celsius instead of Fahrenheit

Example Usage:

{
    "sg": 0.7,
    "degf": 180.0,
    "p1": 1000.0,
    "p2": 3500.0,
    "h2s": 0.0,
    "co2": 0.0,
    "n2": 0.0,
    "zmethod": "DAK"
}

Result: Pseudopressure difference ≈ 1-5 × 10⁶ psia²/cP (typical range).

Note: Pseudopressure is essential for accurate gas flow calculations. Always use reservoir conditions. Account for all non-hydrocarbon components. The integration is performed numerically, so results are approximate but highly accurate.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains the tool's behavior: it performs numerical integration ('The integration is performed numerically'), returns approximate but accurate results, outputs a dictionary with specific keys (value, method, units, inputs), and includes important behavioral notes like 'Always use reservoir conditions' and warnings about common mistakes (e.g., using wrong pressure units or temperature scales).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Pseudopressure Formula, Why Pseudopressure, Applications, Returns, Common Mistakes, Example Usage, Note) and uses bold headings for readability. While comprehensive, it is appropriately sized for a complex 8-parameter tool with no annotations. Some sections like 'Why Pseudopressure' could be slightly condensed, but overall it earns its length with valuable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, no annotations, but with output schema), the description is highly complete. It covers purpose, parameters, formula, rationale, applications, return structure, common mistakes, and example usage. The output schema existence means the description doesn't need to detail return values, but it still provides a helpful summary. This addresses all necessary context for accurate tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Given 0% schema description coverage (the schema has no descriptions for individual parameters beyond the request model), the description compensates fully by providing detailed parameter information. Each parameter is documented with type, required/optional status, valid ranges, typical values, examples, and semantic meaning (e.g., 'Gas specific gravity (air=1.0)', 'Reservoir temperature in °F'). This adds substantial value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculate gas pseudopressure difference (m(p))' with a specific verb ('Calculate') and resource ('gas pseudopressure difference'). It distinguishes from siblings by emphasizing this is a 'CRITICAL GAS ANALYSIS TOOL' for linearizing gas flow equations, unlike other gas property tools like gas_compressibility or gas_viscosity that compute individual properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: 'Essential for accurate gas well performance analysis' and lists specific applications like gas well testing, material balance, and reservoir simulation. However, it does not explicitly state when NOT to use it or name alternative tools for related calculations, though the sibling list includes tools like gas_rate_linear that might be alternatives in some contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_rate_linearA

Calculate gas production rate for linear flow.

INFLOW PERFORMANCE TOOL - Computes gas production rate for horizontal wells or wells with linear flow geometry using real gas pseudopressure formulation. This accounts for pressure-dependent gas properties (Z-factor, viscosity) which are significant for gas systems. More accurate than simplified Darcy's law for gas.

Parameters:

  • pi (float, required): Initial/reservoir pressure in psia. Must be > 0. Example: 5000.0.

  • sg (float, required): Gas specific gravity (air=1). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 180.0.

  • psd (float or list, required): Sandface/draining pressure(s) in psia. Must be > 0 and < pi. Can be scalar or array. Example: 2000.0 or [1000, 2000, 3000].

  • h (float, required): Net pay thickness in feet. Must be > 0. Typical: 10-200 ft. Example: 50.0.

  • k (float, required): Permeability in millidarcies (mD). Must be > 0. Typical: 1-1000 mD. Example: 100.0.

  • area (float, required): Cross-sectional flow area in square feet. Must be > 0. Typical: 100-10000 ft². Example: 1000.0.

  • length (float, required): Flow length in feet. Must be > 0. Typical: 100-5000 ft. Example: 500.0.

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.0.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.0.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.0.

Flow Geometry: Linear flow occurs in:

  • Horizontal wells (early-time flow)

  • Hydraulically fractured vertical wells (fracture flow)

  • Channelized gas reservoirs

  • Edge water drive systems

Pseudopressure Method: Uses real gas pseudopressure (m(p)) which linearizes the gas diffusivity equation: m(p) = 2∫(p/(μZ))dp from pb to p

This accounts for:

  • Z-factor variation with pressure

  • Gas viscosity variation with pressure

  • Non-linear pressure behavior

Flow Formula (Linear): qg = (k × area × (m(pi) - m(pwf))) / (1422 × T × length)

Where PVT properties are integrated over pressure range.

Linear vs Radial Flow:

  • Linear: Flow perpendicular to wellbore (horizontal wells)

  • Radial: Flow converging to wellbore (vertical wells)

  • Linear flow typically has higher productivity than radial

Returns: Dictionary with:

  • value (float or list): Gas rate in MSCF/day (matches input psd shape)

  • method (str): "Pseudopressure linear flow"

  • units (str): "MSCF/day"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not accounting for non-hydrocarbon fractions (H2S, CO2, N2)

  • Confusing flow area (perpendicular to flow) with wellbore area

  • Using wrong flow length (should be distance from boundary to well)

  • Confusing linear flow (horizontal wells) with radial flow (vertical wells)

  • Not accounting for net pay thickness correctly

Example Usage:

{
    "pi": 5000.0,
    "sg": 0.7,
    "degf": 180.0,
    "psd": [2000, 3000, 4000],
    "h": 50.0,
    "k": 100.0,
    "area": 1000.0,
    "length": 500.0,
    "h2s": 0.0,
    "co2": 0.0,
    "n2": 0.0
}

Result: Gas rate decreases as sandface pressure increases (typical IPR curve).

Note: This tool uses pseudopressure method which is more accurate than simplified Darcy's law for gas. Always account for non-hydrocarbon components (H2S, CO2, N2) as they affect Z-factor and flow calculations significantly. Linear flow is characteristic of horizontal wells and hydraulically fractured wells.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure and excels. It explains the pseudopressure method, mathematical formulation, accuracy advantages over simplified Darcy's law, handling of pressure-dependent properties, and detailed return structure. It also covers important behavioral aspects like unit requirements (psia vs psig), typical value ranges, and error prevention through the 'Common Mistakes' section.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Flow Geometry, Pseudopressure Method, etc.) but is quite lengthy. While every section adds value, some information could potentially be more condensed. The front-loaded purpose statement is excellent, but the overall length pushes it slightly below perfect conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (11 parameters, specialized petroleum engineering domain), no annotations, and the presence of an output schema, the description is exceptionally complete. It covers purpose, usage context, mathematical foundation, parameter details, return values, common pitfalls, and example usage. The output schema existence means the description doesn't need to exhaustively document return structure, yet it still provides helpful context about the return dictionary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage (parameters are nested under 'request'), the description provides comprehensive parameter documentation. Each parameter gets detailed explanations including physical meaning, units, validity ranges, typical values, examples, and special considerations (e.g., 'psd' can be scalar or array). This fully compensates for the schema's lack of descriptions and adds substantial value beyond basic parameter definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose: 'Calculate gas production rate for linear flow' with specific context about horizontal wells and real gas pseudopressure formulation. It clearly distinguishes from sibling tools like 'gas_rate_radial' by emphasizing linear flow geometry and contrasting with radial flow in the 'Linear vs Radial Flow' section.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool versus alternatives. It specifies that linear flow occurs in horizontal wells, hydraulically fractured vertical wells, channelized gas reservoirs, and edge water drive systems, and contrasts linear flow with radial flow (which would use 'gas_rate_radial'). The 'Common Mistakes' section further reinforces proper usage scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_rate_radialA

Calculate gas production rate for radial flow (vertical well).

INFLOW PERFORMANCE TOOL - Computes gas production rate for vertical wells with radial flow geometry using real gas pseudopressure formulation. This accounts for pressure-dependent gas properties (Z-factor, viscosity) which are significant for gas systems. More accurate than simplified Darcy's law for gas.

Parameters:

  • pi (float, required): Initial/reservoir pressure in psia. Must be > 0. Example: 5000.0.

  • sg (float, required): Gas specific gravity (air=1). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 180.0.

  • psd (float or list, required): Sandface/draining pressure(s) in psia. Must be > 0 and < pi. Can be scalar or array. Example: 2000.0 or [1000, 2000, 3000].

  • h (float, required): Net pay thickness in feet. Must be > 0. Typical: 10-200 ft. Example: 50.0.

  • k (float, required): Permeability in millidarcies (mD). Must be > 0. Typical: 1-1000 mD. Example: 100.0.

  • s (float, optional, default=0.0): Skin factor (dimensionless). Negative = stimulation, positive = damage. Typical: -5 to +20. Example: 0.0 for undamaged well.

  • re (float, required): Drainage radius in feet. Must be > rw. Typical: 500-5000 ft. Example: 1000.0.

  • rw (float, required): Wellbore radius in feet. Must be > 0. Typical: 0.25-0.5 ft. Example: 0.5.

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.0.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.0.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.0.

Pseudopressure Method: Uses real gas pseudopressure (m(p)) which linearizes the gas diffusivity equation: m(p) = 2∫(p/(μZ))dp from pb to p

This accounts for:

  • Z-factor variation with pressure

  • Gas viscosity variation with pressure

  • Non-linear pressure behavior

Flow Formula: qg = (kh × (m(pi) - m(pwf))) / (1422 × T × (ln(re/rw) + S))

Where PVT properties are integrated over pressure range.

Returns: Dictionary with:

  • value (float or list): Gas rate in MSCF/day (matches input psd shape)

  • method (str): "Pseudopressure radial flow"

  • units (str): "MSCF/day"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not accounting for non-hydrocarbon fractions (H2S, CO2, N2)

  • Using wrong drainage radius (re) - should be well spacing/2

  • Confusing net pay (h) with gross thickness

  • Not accounting for skin factor (s)

Example Usage:

{
    "pi": 5000.0,
    "sg": 0.7,
    "degf": 180.0,
    "psd": [2000, 3000, 4000],
    "h": 50.0,
    "k": 100.0,
    "s": 0.0,
    "re": 1000.0,
    "rw": 0.5,
    "h2s": 0.0,
    "co2": 0.0,
    "n2": 0.0
}

Result: Gas rate decreases as sandface pressure increases (typical IPR curve).

Note: This tool uses pseudopressure method which is more accurate than simplified Darcy's law for gas. Always account for non-hydrocarbon components (H2S, CO2, N2) as they affect Z-factor and flow calculations significantly.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and excels. It discloses the mathematical method (pseudopressure formulation), explains what the calculation accounts for (Z-factor, viscosity variations), provides the flow formula, describes return format, lists common mistakes, and includes example usage. This gives comprehensive behavioral understanding.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, parameters, method, formula, returns, mistakes, example). While comprehensive, some sections like the detailed parameter list and common mistakes are lengthy but necessary for this complex tool. Every sentence adds value, though it could be slightly more front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 12-parameter engineering tool with no annotations, the description provides exceptional completeness. It covers purpose, methodology, parameters, formula, returns, common pitfalls, and examples. The output schema exists but the description still usefully explains return structure. This gives agents everything needed to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description provides extensive parameter documentation. Each parameter gets: purpose explanation, units, validity ranges, typical values, examples, and practical guidance (e.g., 'must be absolute' for pressure, 'should be well spacing/2' for drainage radius). This fully compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates gas production rate for vertical wells with radial flow geometry using real gas pseudopressure formulation. It distinguishes from sibling tools like 'gas_rate_linear' by specifying radial flow geometry and from 'gas_pseudopressure' by focusing on production rate calculation rather than pseudopressure alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (vertical wells with radial flow geometry, gas systems requiring pressure-dependent property accounting) and mentions it's more accurate than simplified Darcy's law. However, it doesn't explicitly state when NOT to use it or name specific alternative tools beyond the general comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_sg_from_compositionA

Calculate gas specific gravity from composition.

COMPOSITIONAL GAS CHARACTERIZATION - Computes gas specific gravity from hydrocarbon molecular weight and non-hydrocarbon mole fractions. Uses molecular weight weighted average method. Essential when gas composition is known but SG measurement is unavailable or unreliable.

Parameters:

  • hc_mw (float, required): Hydrocarbon molecular weight in lb/lbmol. Valid: 10-200. Typical: 16-50. Example: 18.5 for typical natural gas.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.05 for 5% CO2.

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.02 for 2% H2S (sour gas).

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.01 for 1% N2.

  • h2 (float, optional, default=0.0): H2 mole fraction (0-1). Typical: 0-0.01. Example: 0.0 (rare in natural gas).

Calculation Method: Weighted average based on molecular weights:

  • HC fraction: User-provided MW (hc_mw)

  • CO2: MW = 44.01 lb/lbmol

  • H2S: MW = 34.08 lb/lbmol

  • N2: MW = 28.01 lb/lbmol

  • H2: MW = 2.02 lb/lbmol

  • Air: MW = 28.97 lb/lbmol (reference for SG)

Formula: MW_avg = hc_fraction × hc_mw + co2 × 44.01 + h2s × 34.08 + n2 × 28.01 + h2 × 2.02 SG = MW_avg / 28.97

Typical Hydrocarbon MW:

  • Pure methane: 16.04

  • Dry gas (C1-C2): 16-18

  • Associated gas (C1-C4): 18-25

  • Wet gas (C1-C6): 25-35

  • Condensate gas: 35-50

Applications:

  • Compositional Simulation: Convert composition to SG for black oil models

  • Gas Plant Feed: Characterize feed gas from composition analysis

  • Sales Gas Specs: Calculate SG for pipeline specifications

  • Contaminated Gas: Analyze gas with high non-hydrocarbon content

  • Laboratory Data: Convert GC analysis to SG

Non-Hydrocarbon Effects:

  • CO2 increases SG (MW=44.01 > air MW=28.97)

  • H2S increases SG (MW=34.08 > air MW=28.97)

  • N2 slightly decreases SG (MW=28.01 ≈ air MW=28.97)

  • H2 significantly decreases SG (MW=2.02 << air MW=28.97)

Returns: Dictionary with:

  • gas_specific_gravity (float): Gas SG (dimensionless, air=1)

  • composition (dict): Detailed composition breakdown

    • hydrocarbon_fraction: Mole fraction of hydrocarbons

    • hydrocarbon_mw: Provided hydrocarbon MW

    • co2_fraction: CO2 mole fraction

    • h2s_fraction: H2S mole fraction

    • n2_fraction: N2 mole fraction

    • h2_fraction: H2 mole fraction

  • method (str): "Molecular weight weighted average"

  • units (str): "dimensionless (air=1)"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using weight fraction instead of mole fraction

  • Incorrect hydrocarbon MW (must be average MW of HC fraction)

  • Mole fractions don't sum to 1.0 (should sum to 1.0)

  • Using component MW instead of mixture MW for hydrocarbons

  • Not accounting for all non-hydrocarbon components

Example Usage:

{
    "hc_mw": 18.5,
    "co2": 0.05,
    "h2s": 0.0,
    "n2": 0.01,
    "h2": 0.0
}

Result: SG ≈ 0.65-0.70 (typical natural gas with 5% CO2, 1% N2).

Note: Mole fractions must sum to 1.0. If only HC fraction is provided, ensure hc_fraction = 1.0 - (co2 + h2s + n2 + h2). Hydrocarbon MW should be the average MW of the hydrocarbon fraction, not individual component MW.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits. It explains the calculation method in detail, includes typical values and ranges, describes non-hydrocarbon effects on SG, specifies the return structure, and warns about common mistakes and constraints (e.g., 'Mole fractions must sum to 1.0').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections but is overly verbose for a tool description. While all content is valuable, it includes extensive details like the full formula, typical hydrocarbon MW ranges, and multiple application examples that could be condensed. It's front-loaded with purpose, but later sections add bulk.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the calculation, no annotations, and an output schema (implied by the 'Returns' section), the description is highly complete. It covers purpose, usage, parameters, method, outputs, examples, and pitfalls, leaving no gaps for an AI agent to understand and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must compensate, which it does excellently. It provides detailed parameter semantics: purpose, units, valid ranges, typical values, examples, and contextual meaning (e.g., 'hc_mw' as 'average MW of the hydrocarbon fraction, not individual component MW'). This goes far beyond what a bare schema would offer.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculate gas specific gravity from composition' using a specific method ('molecular weight weighted average'). It distinguishes from siblings like 'gas_sg_from_gradient' and 'weighted_average_gas_sg' by emphasizing compositional input rather than gradient or averaging of multiple SG values.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: 'Essential when gas composition is known but SG measurement is unavailable or unreliable.' It also lists specific applications (e.g., 'Compositional Simulation,' 'Gas Plant Feed') and provides guidance on when not to use it via 'Common Mistakes' (e.g., 'Using weight fraction instead of mole fraction').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_sg_from_gradientA

Calculate gas specific gravity from pressure gradient.

DIAGNOSTIC TOOL - Determines gas specific gravity from measured pressure gradient in a gas column. Uses standalone Newton-Raphson solver (fixed implementation) to solve the inverse problem. Essential for formation fluid identification and gas property verification when only gradient data is available.

Parameters:

  • gradient (float, required): Pressure gradient in psi/ft. Must be > 0. Typical: 0.05-0.15 psi/ft. Example: 0.1 psi/ft.

  • degf (float, required): Temperature in °F at measurement depth. Valid: -460 to 1000. Typical: 100-400°F. Example: 180.0.

  • p (float, required): Pressure in psia at measurement depth. Must be > 0. Example: 3500.0.

  • method (str, optional, default="DAK"): Z-factor method for calculation. Options: "DAK", "HY", "WYW", "BUR". DAK recommended.

Gradient Principle: Gas gradient = dP/dh = (ρg × g) / 144 = (P × MW) / (Z × R × T × 144)

Where:

  • ρg = gas density (lb/cuft)

  • MW = molecular weight = sg × 28.97 lb/lbmol

  • Z = gas compressibility factor

  • R = gas constant = 10.732 psia·ft³/(lbmol·°R)

  • T = temperature (°R = °F + 460)

Applications:

  • Formation Fluid ID: Identify gas vs oil vs water from gradient

  • Gas Density Verification: Check measured gas gravity against gradient

  • Completion Fluid Design: Design mud weight based on gas gradient

  • Wellbore Pressure Modeling: Calculate pressure profiles in gas columns

Typical Gradients:

  • Dry gas (sg=0.6): ~0.08 psi/ft

  • Associated gas (sg=0.8): ~0.11 psi/ft

  • Heavy gas (sg=1.0): ~0.14 psi/ft

Solution Method: Uses Newton-Raphson iterative solver to find sg that yields the specified gradient. This is a standalone fixed implementation that avoids upstream library bugs.

Returns: Dictionary with:

  • value (float): Gas specific gravity (dimensionless, air=1)

  • method (str): "Gradient correlation (Newton-Raphson)"

  • units (str): "dimensionless (air=1)"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not accounting for non-hydrocarbon fractions (affects MW and Z)

  • Using wrong gradient units (must be psi/ft, not psi/100ft)

  • Temperature in Celsius instead of Fahrenheit

Example Usage:

{
    "gradient": 0.1,
    "degf": 180.0,
    "p": 3500.0,
    "method": "DAK"
}

Result: Gas SG ≈ 0.7-0.8 for typical natural gas gradient.

Note: This tool uses a standalone fixed implementation to avoid upstream bugs. Always use reservoir conditions (pressure and temperature at measurement depth). Gradient is sensitive to temperature - use correct temperature for accurate results.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains the tool's behavior: it uses a 'Newton-Raphson iterative solver,' is a 'standalone fixed implementation' to avoid bugs, returns a dictionary with specific keys, and details sensitivity to inputs like temperature. It also covers constraints (e.g., gradient must be > 0) and typical use cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections like 'Parameters,' 'Gradient Principle,' and 'Applications,' making it easy to navigate. It is appropriately sized for a complex tool, but some sections (e.g., 'Gradient Principle' formula) are detailed and could be slightly condensed without losing clarity. Overall, it's efficient and front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, no annotations, and an output schema (implied by 'Returns' section), the description is highly complete. It covers purpose, usage, parameters, behavioral details, applications, examples, and common mistakes. The output schema is described in the 'Returns' section, ensuring the agent understands the response format without redundancy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must compensate. It provides detailed parameter semantics: 'gradient' as pressure gradient in psi/ft with typical ranges, 'degf' as temperature in °F with valid ranges, 'p' as pressure in psia, and 'method' as Z-factor method with options and recommendations. This adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculate gas specific gravity from pressure gradient.' It specifies the verb 'calculate' and the resource 'gas specific gravity' from 'pressure gradient,' and distinguishes it from sibling tools like 'gas_sg_from_composition' by focusing on gradient-based calculation rather than compositional analysis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: 'Essential for formation fluid identification and gas property verification when only gradient data is available.' It also provides context in the 'Applications' section, such as 'Formation Fluid ID' and 'Gas Density Verification,' and warns against common mistakes like using wrong units or temperatures, guiding proper usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_viscosityA

Calculate gas viscosity (μg).

CRITICAL GAS PVT PROPERTY - Computes gas viscosity at reservoir conditions using Lee, Gonzalez & Eakin (1966) correlation, industry standard for natural gas. Viscosity affects flow rates, pressure drops, and well performance. Gas viscosity increases with pressure and temperature, opposite to liquid behavior.

Parameters:

  • sg (float, required): Gas specific gravity (air=1.0). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Typical: 100-400°F. Example: 180.0.

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3500.0 or [1000, 2000, 3000, 4000].

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.02.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.05.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.01.

  • zmethod (str, optional, default="DAK"): Z-factor method for viscosity calculation. Options: "DAK", "HY", "WYW", "BUR". DAK recommended.

Viscosity Behavior:

  • Increases with pressure (gas molecules closer together)

  • Increases with temperature (molecular motion increases)

  • Typical range: 0.01-0.05 cP at reservoir conditions

  • At standard conditions: ~0.01 cP

Lee-Gonzalez-Eakin Correlation: Uses Z-factor internally to account for real gas behavior. More accurate than ideal gas assumptions, especially at high pressures.

Returns: Dictionary with:

  • value (float or list): Viscosity in cP (matches input p shape)

  • method (str): "Lee-Gonzalez-Eakin"

  • units (str): "cP"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not accounting for non-hydrocarbon fractions

  • Confusing gas viscosity (increases with P) with oil viscosity (decreases with P)

  • Temperature in Celsius instead of Fahrenheit

Example Usage:

{
    "sg": 0.7,
    "degf": 180.0,
    "p": [1000, 2000, 3000, 4000],
    "h2s": 0.0,
    "co2": 0.05,
    "n2": 0.01,
    "zmethod": "DAK"
}

Result: Viscosity increases from ~0.012 cP at 1000 psia to ~0.025 cP at 4000 psia.

Note: Gas viscosity is much lower than oil viscosity (typically 0.01-0.05 cP vs 0.5-10 cP). Always use reservoir conditions, not separator conditions. Account for all non-hydrocarbon components for accuracy.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and excels. It explains the correlation method used, typical viscosity ranges (0.01-0.05 cP), how viscosity changes with pressure/temperature, the tool's accuracy advantages over ideal gas assumptions, and detailed return format. It also covers practical considerations like unit requirements and component accounting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Viscosity Behavior, Correlation, Returns, Common Mistakes, Example) but is quite lengthy. While every section adds value, some information could be more condensed. The front-loading is good with purpose and criticality stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex calculation tool with 7 parameters, 0% schema coverage, and no annotations, the description provides exceptional completeness. It covers purpose, usage, parameters, behavior, methodology, return format, common mistakes, and examples. The output schema exists but the description still usefully explains the return structure and units.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description provides comprehensive parameter documentation: valid ranges, typical values, examples, optional/default values, and practical explanations for each parameter. It adds significant meaning beyond the bare schema, including the 'zmethod' options with recommendation and clarification that 'p' can be scalar or array.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates gas viscosity using the Lee, Gonzalez & Eakin correlation, specifying it's for natural gas at reservoir conditions. It distinguishes itself from sibling tools like 'oil_viscosity' by explicitly contrasting gas vs. oil viscosity behavior and mentioning it's a critical PVT property for flow rates and pressure drops.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool vs. alternatives: it specifies it's for gas (not oil), at reservoir conditions (not separator conditions), and uses real gas behavior (not ideal gas). It also warns against common mistakes like using wrong temperature units or pressure types, which implicitly defines when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_water_contentA

Calculate water content of natural gas.

CRITICAL GAS PROCESSING TOOL - Computes the amount of water vapor that natural gas can hold at given pressure and temperature conditions. Essential for hydrate prevention, dehydration unit design, and pipeline operation. Water content decreases with increasing pressure and decreasing temperature.

Parameters:

  • sg (float, required): Gas specific gravity (air=1.0). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7.

  • degf (float, required): Temperature in °F. Valid: -460 to 1000. Typical: 40-200°F. Example: 100.0.

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 1000.0 or [500, 1000, 2000].

Water Content Behavior:

  • Decreases with increasing pressure (less water can dissolve)

  • Decreases with decreasing temperature (less water vapor)

  • Typical range: 5-200 lb/MMSCF at pipeline conditions

  • At high pressure/low temperature: <10 lb/MMSCF

Hydrate Formation: Gas-water systems form solid hydrates (ice-like structures) at certain P-T conditions. Hydrates can block pipelines and equipment. Gas must be dehydrated below:

  • Hydrate formation temperature at operating pressure

  • Typical target: <7 lb/MMSCF for pipeline operation

  • Typical target: <0.1 lb/MMSCF for LNG/cryogenic processes

Correlation: Uses McCain correlation (1990) based on experimental data for sweet natural gas. Valid for typical pipeline and processing conditions.

Applications:

  • Hydrate Prevention: Determine minimum dehydration requirement

  • Dehydration Unit Design: Size glycol contactors and regenerators

  • Pipeline Corrosion: Assess water-related corrosion risk

  • Gas Processing: Design dehydration systems for sales gas

  • Sales Gas Specs: Ensure compliance with water content limits

Returns: Dictionary with:

  • value (float or list): Water content in lb/MMSCF (matches input p shape)

  • method (str): "McCain (1990) correlation"

  • units (str): "lb/MMSCF"

  • inputs (dict): Echo of input parameters

  • note (str): Hydrate prevention guidance

Common Mistakes:

  • Using separator temperature instead of pipeline/processing temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not understanding hydrate formation conditions

  • Confusing water content (lb/MMSCF) with water dew point (°F)

  • Temperature in Celsius instead of Fahrenheit

Example Usage:

{
    "sg": 0.7,
    "degf": 100.0,
    "p": [500, 1000, 2000]
}

Result: Water content decreases from ~50 lb/MMSCF at 500 psia to ~20 lb/MMSCF at 2000 psia.

Note: Water content is critical for pipeline operation. Always check against hydrate formation curve. For hydrate prevention, compare to hydrate formation temperature at operating pressure. Typical pipeline requirement: <7 lb/MMSCF.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and excels by disclosing behavioral traits: it explains the correlation method (McCain 1990), valid ranges, typical outputs (5-200 lb/MMSCF), critical applications, common mistakes, and return structure. It also details how water content behaves with pressure and temperature changes, providing comprehensive operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Water Content Behavior, Applications, Returns, etc.), but it is lengthy. Every sentence adds value, such as explaining hydrate formation and common mistakes, but it could be more front-loaded; the core purpose is stated early, but some details might be condensed for better conciseness without losing essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool (engineering calculation with critical safety implications), no annotations, and an output schema that documents return values, the description is complete. It covers purpose, usage, parameters, behavior, applications, returns, and common pitfalls, providing all necessary context for an AI agent to invoke the tool correctly and understand its significance in gas processing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate fully. It adds extensive meaning beyond the bare schema: defines each parameter (sg, degf, p) with units, valid ranges, typical values, examples, and behavioral effects (e.g., water content decreases with increasing pressure). This thoroughly documents all parameters, making the tool's inputs clear and actionable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific purpose: 'Calculate water content of natural gas' with the verb 'calculate' and resource 'water content of natural gas'. It distinguishes from siblings by focusing on water content calculation specifically for hydrate prevention and dehydration design, unlike other tools that handle properties like compressibility, density, or viscosity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided on when to use this tool: 'Essential for hydrate prevention, dehydration unit design, and pipeline operation.' It also specifies alternatives implicitly by mentioning related concepts (e.g., water dew point) and contexts where it's critical, such as pipeline operation vs. LNG processes, helping differentiate from sibling tools that might calculate other gas properties.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_z_factorA

Calculate gas compressibility factor (Z-factor).

CRITICAL GAS PVT PROPERTY - The Z-factor corrects the ideal gas law (PV=nRT) for real gas behavior. Z = 1.0 for ideal gas, Z < 1.0 for most real gases at reservoir conditions. Essential for all gas reservoir calculations including material balance, reserve estimation, and flow calculations.

Parameters:

  • sg (float, required): Gas specific gravity (air=1.0). Valid: 0.55-3.0. Typical: 0.6-1.2. Example: 0.7 for dry gas, 0.85 for associated gas.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Typical: 100-400°F. Example: 180.0.

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3500.0 or [1000, 2000, 3000, 4000].

  • h2s (float, optional, default=0.0): H2S mole fraction (0-1). Typical: 0-0.05. Example: 0.02 for 2% H2S. High H2S requires special handling.

  • co2 (float, optional, default=0.0): CO2 mole fraction (0-1). Typical: 0-0.20. Example: 0.05 for 5% CO2.

  • n2 (float, optional, default=0.0): N2 mole fraction (0-1). Typical: 0-0.10. Example: 0.01 for 1% N2.

  • method (str, optional, default="DAK"): Correlation method. Options: "DAK", "HY", "WYW", "BUR". DAK recommended.

Z-Factor Behavior:

  • Low pressure: Z ≈ 1.0 (ideal gas behavior)

  • Medium pressure: Z < 1.0 (attractive forces dominate)

  • High pressure: Z > 1.0 (repulsive forces dominate)

  • Typical range: 0.7-1.2 for reservoir conditions

Method Selection:

  • DAK (Dranchuk & Abou-Kassem 1975): RECOMMENDED. Most accurate, widely validated. Use for: All applications, high accuracy requirements.

  • HY (Hall & Yarborough 1973): Classic method, fast. Use for: Quick estimates, compatibility with older methods.

  • WYW (Wang, Ye & Wu 2021): Newer correlation. Use for: Comparison studies, modern applications.

  • BUR (Burrows 1981): Alternative method. Use for: Specific regional correlations.

Non-Hydrocarbon Effects:

  • H2S and CO2 increase Z-factor (reduce compressibility)

  • N2 has minimal effect

  • For sour gas (H2S > 5%), use Wichert-Aziz correction (not included here)

Returns: Dictionary with:

  • value (float or list): Z-factor (dimensionless, matches input p shape)

  • method (str): Method used

  • units (str): "dimensionless"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not accounting for non-hydrocarbon fractions (H2S, CO2, N2)

  • Using wrong gas gravity (must be separator gas gravity, not sales gas)

  • Temperature in Celsius instead of Fahrenheit

Example Usage:

{
    "sg": 0.7,
    "degf": 180.0,
    "p": [1000, 2000, 3000, 4000],
    "h2s": 0.0,
    "co2": 0.05,
    "n2": 0.01,
    "method": "DAK"
}

Result: Z decreases from ~0.95 at 1000 psia to ~0.85 at 3000 psia, then increases to ~0.90 at 4000 psia (typical behavior).

Note: Z-factor is critical for accurate gas calculations. Always use DAK method unless specific compatibility requirements exist. Account for all non-hydrocarbon components for accurate results.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains the tool's behavior: 'Z-Factor Behavior' section describes how Z varies with pressure, 'Non-Hydrocarbon Effects' explains how inputs affect results, 'Returns' details the output structure, and 'Common Mistakes' lists critical usage pitfalls. This covers behavioral aspects like input validation, output format, and error-prone scenarios.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Z-Factor Behavior, Method Selection, etc.), making it easy to navigate. However, it is quite lengthy (over 500 words), which may be excessive for some contexts. Every sentence adds value, but it could be more front-loaded by moving the 'Returns' section earlier. The efficiency is high, but the overall size slightly impacts conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple parameters, no annotations, 0% schema coverage), the description is exceptionally complete. It covers purpose, usage, parameters, behavior, method selection, output format, common mistakes, and examples. The presence of an output schema (implied by 'Has output schema: true') is complemented by the detailed 'Returns' section. No gaps remain for effective tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate. It provides extensive parameter semantics: each parameter is documented with purpose, valid ranges, typical values, examples, and effects on calculation (e.g., 'H2S and CO2 increase Z-factor'). The 'Parameters' section adds meaning beyond basic schema types, including practical guidance like 'must be absolute' for pressure and 'separator gas gravity' for sg.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose: 'Calculate gas compressibility factor (Z-factor).' It distinguishes this tool from siblings by specifying it's for gas (not oil/brine) and focuses on a specific PVT property, unlike general calculation tools in the list. The opening section emphasizes its critical role in gas reservoir calculations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool vs. alternatives. It states: 'Essential for all gas reservoir calculations including material balance, reserve estimation, and flow calculations,' and includes a 'Method Selection' section with recommendations (e.g., 'DAK recommended,' 'Use for: All applications, high accuracy requirements'). It also warns about limitations: 'For sour gas (H2S > 5%), use Wichert-Aziz correction (not included here).'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_aquifer_influenceA

Generate Van Everdingen & Hurst aquifer influence functions.

CRITICAL AQUIFER MODELING TOOL - Creates dimensionless aquifer influence functions for AQUTAB keyword in ECLIPSE/Intersect. These functions quantify water influx from surrounding aquifers into hydrocarbon reservoirs.

Parameters:

  • res (float or list, required): Dimensionless aquifer radius (ReD). Must be > 1.0. Can be scalar or list. Typical: 5-100. Example: 10.0. ReD = re/rw where re = aquifer outer radius, rw = reservoir radius.

  • start (float, required): Minimum dimensionless time (tD_min). Must be > 0. Typical: 0.01-1.0. Example: 0.1.

  • end (float, required): Maximum dimensionless time (tD_max). Must be > start. Typical: 10-1000. Example: 100.0.

  • rows (int, required): Number of time points in table. Must be > 0. Typical: 20-100. Example: 50. More rows = smoother curves.

Background: Van Everdingen & Hurst (1949) developed analytical solutions for aquifer influx using diffusivity equation. These functions relate:

  • Dimensionless time (tD) = (k × t) / (φ × μ × ct × rw²)

  • Dimensionless pressure (pD) = aquifer response function

  • Dimensionless radius (ReD) = aquifer geometry

Influence Function: The influence function pD(tD, ReD) represents the dimensionless pressure response at the reservoir-aquifer boundary. It depends on:

  • Aquifer geometry (radial vs linear, finite vs infinite)

  • Boundary conditions (constant rate vs constant pressure)

  • Aquifer properties (permeability, porosity, compressibility)

Applications:

  • Material Balance: Quantify aquifer support in material balance analysis

  • Pressure Maintenance: Evaluate aquifer pressure support

  • Water Influx: Calculate cumulative water influx over time

  • History Matching: Match production history with aquifer model

  • Production Forecasting: Predict future aquifer influx

Integration Method: Uses numerical integration (Gaussian quadrature) of diffusivity equation with high-resolution integration (M=8) for accuracy. The solution is computed at specified dimensionless time points.

Returns: Dictionary with:

  • dimensionless_time (list): Dimensionless time values (tD)

  • dimensionless_pressures (list): List of pD arrays (one per ReD)

  • rows (int): Number of time points

  • dimensionless_radii (list): ReD values used

  • time_range (dict): Start and end dimensionless times

  • note (str): Usage guidance for ECLIPSE

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • ReD < 1.0 (aquifer radius must be > reservoir radius)

  • tD_max < tD_min (end must be > start)

  • Too few rows (<10) causing poor resolution

  • Wrong dimensionless radius (must match aquifer geometry)

  • Confusing dimensionless time with actual time

  • Not accounting for aquifer compressibility

Example Usage:

{
    "res": 10.0,
    "start": 0.1,
    "end": 100.0,
    "rows": 50
}

Result: Table with 50 time points from tD=0.1 to tD=100.0 for ReD=10.0.

Note: AQUTAB keyword is ready for direct inclusion in ECLIPSE DATA file. The influence functions are dimensionless and must be scaled using reservoir and aquifer properties. For multiple aquifers, generate separate tables for each aquifer with different ReD values.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains what the tool does (creates dimensionless aquifer influence functions), the integration method (numerical integration with Gaussian quadrature), output format (dictionary with specific keys), and practical considerations like common mistakes and scaling requirements. This provides comprehensive behavioral context beyond basic functionality.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Background, Applications, etc.), but it's quite lengthy with multiple paragraphs that could be more streamlined. While all content is relevant, some sections (like extensive background theory) might be more detailed than necessary for tool selection, affecting conciseness despite good organization.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (aquifer modeling with multiple parameters), no annotations, and an output schema that exists but isn't detailed here, the description provides exceptional completeness. It covers purpose, parameters, methodology, outputs, applications, common mistakes, examples, and integration instructions, making it fully self-contained for understanding and using the tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage (the schema has only one parameter 'request' with nested properties), the description compensates fully by detailing four key parameters (res, start, end, rows) with their meanings, constraints, typical ranges, examples, and physical interpretations. It also covers additional parameters from the schema (like infl, ei, piston) in the background and application sections, providing substantial semantic value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool generates Van Everdingen & Hurst aquifer influence functions for AQUTAB keyword in ECLIPSE/Intersect, specifying both the action ('generate') and resource ('aquifer influence functions'). It clearly distinguishes this from sibling tools by focusing on aquifer modeling rather than fluid properties or other reservoir engineering calculations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (aquifer modeling, material balance, pressure maintenance, etc.) and mentions integration with ECLIPSE. However, it does not explicitly state when NOT to use it or name specific alternatives among the sibling tools, though the specialized nature implies it's for aquifer-specific calculations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_black_oil_tableA

Generate comprehensive black oil PVT table.

COMPREHENSIVE PVT TABLE GENERATOR - Creates complete black oil PVT table with all properties (Rs, Bo, μo, ρo, Co) at pressures from 14.7 psia to specified maximum. This is the most comprehensive PVT tool, generating complete tables for reservoir simulation input or analysis. Optionally exports ECLIPSE-compatible keywords.

Parameters:

  • pi (float, required): Initial reservoir pressure in psia. Must be > 0. Example: 4000.0. Table starts from 14.7 psia and goes up to pmax.

  • api (float, required): Oil API gravity in degrees. Valid: 0-100. Example: 38.0.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 175.0.

  • sg_g (float, required): Gas specific gravity (air=1). Valid: 0-3. Typical: 0.6-1.2. Example: 0.68.

  • pmax (float, optional, default=0.0): Maximum pressure for table in psia. If 0, auto-calculates as pi × 1.5. Must be > pi. Example: 5000.0.

  • pb (float, optional, default=0.0): Bubble point pressure in psia. If 0, will be calculated. Example: 3900.0.

  • rsb (float, optional, default=0.0): Solution GOR at bubble point in scf/stb. If 0, will be calculated. Example: 2300.0.

  • nrows (int, optional, default=50): Number of table rows. Valid: 1-200. More rows = finer resolution. Typical: 20-100. Example: 50.

  • export (bool, optional, default=False): Export ECLIPSE-compatible files. If True, creates PVTO.INC, PVDO.INC, DENSITY.INC files. Example: False.

  • pb_method (str, optional, default="VALMC"): Bubble point method. Options: "STAN", "VALMC", "VELAR". VALMC recommended.

  • rs_method (str, optional, default="VELAR"): Solution GOR method. Options: "VELAR", "STAN", "VALMC". VELAR recommended.

  • bo_method (str, optional, default="MCAIN"): Oil FVF method. Options: "MCAIN", "STAN". MCAIN recommended.

  • uo_method (str, optional, default="BR"): Oil viscosity method. Only "BR" available.

Generated Properties:

  • Rs: Solution gas-oil ratio (scf/stb) - increases with pressure up to pb

  • Bo: Formation volume factor (rb/stb) - peaks at bubble point

  • μo: Oil viscosity (cP) - minimum at bubble point

  • ρo: Oil density (lb/cuft) - calculated from mass balance

  • Co: Oil compressibility (1/psi) - increases near bubble point

Table Structure: Pressure values are logarithmically spaced from 14.7 psia to pmax, with finer spacing near bubble point for accuracy.

ECLIPSE Export: When export=True, generates:

  • PVTO.INC: Pressure-dependent oil properties (for undersaturated oil)

  • PVDO.INC: Dead oil properties (for heavy oils)

  • DENSITY.INC: Oil density table

Returns: Dictionary with:

  • table (list of dicts): PVT table data, each dict contains pressure and all properties

  • summary (dict): Key values (bubble point, rsb, Bob, μob, etc.)

  • columns (list): Column names in table

  • methods (dict): Methods used for each property

  • export_files (dict, optional): File names if export=True

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Setting pmax too low (should be > pi for complete table)

  • Not providing pb and rsb when known (reduces accuracy)

  • Using wrong correlation methods (use recommended defaults)

  • Too few rows (nrows < 20) causing poor resolution

  • Not understanding table format for simulation input

Example Usage:

{
    "pi": 4000.0,
    "api": 38.0,
    "degf": 175.0,
    "sg_g": 0.68,
    "pmax": 5000.0,
    "pb": 3900.0,
    "rsb": 2300.0,
    "nrows": 50,
    "export": False,
    "pb_method": "VALMC",
    "rs_method": "VELAR",
    "bo_method": "MCAIN",
    "uo_method": "BR"
}

Result: Complete PVT table with 50 rows covering 14.7-5000 psia with all properties.

Note: This is the most comprehensive PVT tool. Use for complete reservoir analysis or simulation input preparation. Always provide pb and rsb when available for best accuracy. For simulation, set export=True to generate ECLIPSE keywords.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and does well by explaining key behaviors: it generates tables with logarithmic pressure spacing, finer near bubble point; optionally exports ECLIPSE files; calculates missing values (pb, rsb) when not provided; and returns a dictionary with table, summary, columns, etc. It doesn't mention computational cost or rate limits, but covers most operational aspects thoroughly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Generated Properties, Table Structure, etc.) and front-loads the core purpose. While comprehensive, some sections like the detailed parameter documentation are necessarily lengthy given the complexity. Every sentence adds value, though it could be slightly more concise in the 'Common Mistakes' and 'Example Usage' sections.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (13 parameters, no annotations, but has output schema), the description is remarkably complete. It explains what the tool does, when to use it, all parameters thoroughly, generated properties, table structure, export functionality, return format, common mistakes, and includes a full example. The output schema existence means it doesn't need to exhaustively document return values, which it appropriately references.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate - and it does excellently. Each parameter is documented with meaning, units, validity ranges, examples, defaults, and practical notes (e.g., 'If 0, auto-calculates', 'Typical: 0.6-1.2', 'More rows = finer resolution'). It adds significant value beyond what a bare schema would provide, explaining parameter interactions and recommendations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Generate comprehensive black oil PVT table' with specific properties (Rs, Bo, μo, ρo, Co) and pressure range (14.7 psia to specified maximum). It distinguishes from siblings by emphasizing it's 'the most comprehensive PVT tool' for 'complete tables for reservoir simulation input or analysis', unlike simpler property calculators in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool ('Use for complete reservoir analysis or simulation input preparation') and provides alternatives by noting it's 'the most comprehensive PVT tool', implying simpler sibling tools like 'oil_bubble_point' or 'oil_solution_gor' might be used for specific calculations. It also includes 'Common Mistakes' section with practical guidance on parameter settings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_layer_distributionA

Generate layered permeability distribution from Lorenz coefficient.

LAYER PROPERTY GENERATION - Creates detailed layer-by-layer permeability and thickness distribution matching specified heterogeneity. Essential for building reservoir simulation models and predicting waterflood performance.

Parameters:

  • lorenz (float, required): Lorenz coefficient (0-1). Must be 0 ≤ L ≤ 1. Typical: 0.2-0.7. Example: 0.6 for moderate heterogeneity.

  • nlay (int, required): Number of layers to generate. Must be > 0. Typical: 5-50. Example: 10 for 10-layer model.

  • k_avg (float, required): Average permeability in mD. Must be > 0. Typical: 10-1000 mD. Example: 100.0 mD.

  • h (float, optional, default=100.0): Total thickness in feet. Must be > 0. Typical: 50-500 ft. Example: 100.0 ft.

Method: Uses Dykstra-Parsons log-normal permeability distribution with correlation to Lorenz coefficient to generate realistic layer properties:

  1. Convert Lorenz to beta parameter

  2. Generate log-normal permeability distribution

  3. Sort layers by permeability (ascending)

  4. Assign equal thickness to each layer

  5. Calculate layer statistics

Output Properties: For each layer:

  • Thickness (ft): Layer thickness (equal for all layers)

  • Permeability (mD): Layer permeability (log-normal distribution)

  • Thickness Fraction: Fraction of total thickness

  • kh Fraction: Fraction of total flow capacity (k × h)

Statistics Calculated:

  • k_min, k_max: Minimum and maximum permeability

  • k_avg, k_median: Average and median permeability

  • k_std: Standard deviation

  • Heterogeneity ratio: k_max / k_min

Critical for:

  • Reservoir Simulation: Generate layer properties for simulation models

  • Waterflood Prediction: Predict sweep efficiency and recovery

  • Vertical Sweep Efficiency: Analyze vertical conformance

  • Conformance Studies: Evaluate production allocation

  • Upscaling: Create coarse-scale models from fine-scale data

  • Sensitivity Analysis: Test impact of heterogeneity on performance

Usage Example: For 10-layer simulation model with Lorenz=0.6:

{
    "lorenz": 0.6,
    "nlay": 10,
    "k_avg": 100.0,
    "h": 100.0
}

Result: 10 layers with permeabilities ranging from ~20 mD (low-k) to ~500 mD (high-k), each with 10 ft thickness. High-k layers have higher kh fractions.

Returns: Dictionary with:

  • layers (list): List of dicts with layer properties (thickness, permeability, fractions)

  • statistics (dict): Permeability statistics (min, max, avg, median, std, ratio)

  • total_thickness_ft (float): Total thickness

  • average_permeability_md (float): Average permeability

  • lorenz_coefficient (float): Input Lorenz coefficient

  • number_of_layers (int): Number of layers

  • method (str): "Dykstra-Parsons log-normal distribution"

  • note (str): Usage guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Lorenz coefficient outside valid range (must be 0-1)

  • Too few layers (<5) causing poor resolution

  • Too many layers (>50) causing unnecessary complexity

  • Wrong average permeability (must match reservoir average)

  • Not understanding that layers are sorted by permeability

  • Confusing thickness fraction with absolute thickness

Example Usage:

{
    "lorenz": 0.6,
    "nlay": 10,
    "k_avg": 100.0,
    "h": 100.0
}

Result: 10 layers with log-normal permeability distribution, each 10 ft thick. Permeability ranges from ~20 mD to ~500 mD, matching Lorenz=0.6 heterogeneity.

Note: This generates idealized layer properties assuming log-normal permeability distribution and equal layer thickness. For actual reservoirs, use measured core or log data when available. Layer properties are ready for direct use in reservoir simulation models.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and excels at behavioral disclosure. It explains the mathematical method (Dykstra-Parsons log-normal distribution), output structure, common mistakes, limitations (idealized properties vs actual reservoir data), and specific constraints like layer sorting and equal thickness assignment.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is comprehensive but lengthy with some redundancy (usage example appears twice). While well-structured with clear sections, it could be more concise by eliminating repetition and tightening some explanations without losing essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, no annotations, and rich output schema, the description provides complete context. It explains the method, output structure, applications, limitations, and practical considerations, making it fully self-contained for an AI agent to understand and use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description provides extensive parameter documentation including purpose, valid ranges, typical values, examples, and practical guidance. It covers all parameters (lorenz, nlay, k_avg, h) and explains their relationships and constraints beyond what the bare schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool generates layered permeability distributions from a Lorenz coefficient, specifying it creates detailed layer-by-layer permeability and thickness distributions. It distinguishes from siblings by focusing on reservoir simulation model building and waterflood prediction, which none of the sibling tools mention.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (reservoir simulation, waterflood prediction, conformance studies, etc.) and includes a 'Critical for' section with specific applications. However, it doesn't explicitly state when NOT to use it or name specific alternative tools among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_rel_perm_tableA

Generate relative permeability table for reservoir simulation.

CRITICAL SIMULATION TOOL - Creates saturation-dependent relative permeability curves for ECLIPSE, Intersect, CMG, or other simulators. Relative permeability is essential for multiphase flow simulation and determines fluid mobility.

Parameters:

  • rows (int, required): Number of saturation points in table. Must be > 0. Typical: 20-50. Example: 25. More rows = smoother curves but larger files.

  • krtable (str, required): Table type. Options: "SWOF", "SGOF", "SGWFN". Example: "SWOF" for water-oil systems.

  • krfamily (str, required): Correlation family. Options: "COR" (Corey), "LET". Example: "COR" for simple power-law, "LET" for flexible fitting.

  • kromax (float, required): Maximum oil relative permeability (0-1). Typical: 0.5-1.0. Example: 1.0.

  • swc (float, required): Connate water saturation (0-1). Must be < 1. Typical: 0.1-0.3. Example: 0.15.

  • krwmax (float, optional): Maximum water rel perm for SWOF (0-1). Typical: 0.1-0.5. Example: 0.25.

  • krgmax (float, optional): Maximum gas rel perm for SGOF/SGWFN (0-1). Typical: 0.5-1.0. Example: 1.0.

  • sorw (float, optional): Residual oil saturation to water (0-1). Typical: 0.1-0.3. Example: 0.15.

  • sorg (float, optional): Residual oil saturation to gas (0-1). Typical: 0.05-0.2. Example: 0.1.

  • sgc (float, optional): Critical gas saturation (0-1). Typical: 0.05-0.15. Example: 0.1.

  • swcr (float, optional): Critical water saturation for Corey (0-1). Typical: 0.15-0.25. Example: 0.2.

  • no (float, optional): Corey exponent for oil (Corey only). Must be > 0. Typical: 2.0-4.0. Example: 2.5. Higher = more curved.

  • nw (float, optional): Corey exponent for water (Corey only). Must be > 0. Typical: 1.5-3.0. Example: 1.5.

  • ng (float, optional): Corey exponent for gas (Corey only). Must be > 0. Typical: 2.0-3.5. Example: 2.0.

  • Lo, Eo, To (float, optional): LET parameters for oil (LET only). Typical: Lo=1-3, Eo=1-2, To=1-3. Example: Lo=2.5, Eo=1.25, To=1.75.

  • Lw, Ew, Tw (float, optional): LET parameters for water (LET only). Typical: Lw=1-3, Ew=1-2, Tw=1-3. Example: Lw=1.5, Ew=1.0, Tw=2.0.

  • Lg, Eg, Tg (float, optional): LET parameters for gas (LET only). Typical: Lg=1-3, Eg=1-2, Tg=1-3. Example: Lg=1.2, Eg=1.5, Tg=2.0.

Correlation Families:

  • Corey (1954): Simple power-law model, fast, widely used. Formula: Kr = krmax * ((S - Sc) / (1 - Swc - Sor))^n Use for: Quick estimates, standard cases, compatibility.

  • LET (2005): Flexible 3-parameter model, better curve fitting. Formula: Kr = krmax * (S^L) / (S^L + E * (1-S)^T) Use for: History matching, complex curves, accuracy.

Table Types:

  • SWOF: Water-Oil (waterflood, aquifer influx). Columns: Sw, Krw, Kro, Pcow.

  • SGOF: Gas-Oil (gas cap expansion, gas injection). Columns: Sg, Krg, Krog, Pcog.

  • SGWFN: Three-phase gas-water (gas cycling, WAG). Columns: Sg, Krg, Krw, Pcog, Pcow.

Saturation Endpoints:

  • Swc: Connate water (immobile water)

  • Sorw: Residual oil to water (trapped oil after waterflood)

  • Sorg: Residual oil to gas (trapped oil after gas injection)

  • Sgc: Critical gas (minimum gas saturation for flow)

Workflow:

  1. Choose correlation family (Corey or LET)

  2. Select table type (SWOF, SGOF, SGWFN)

  3. Specify saturation endpoints (Swc, Sor, Sgc)

  4. Set maximum rel perms (kromax, krwmax, krgmax)

  5. Define correlation parameters (Corey exponents or LET params)

  6. Generate table with specified number of rows

Returns: Dictionary with:

  • table (list): List of dicts with saturation and rel perm values

  • columns (list): Column names (e.g., ["Sw", "Krw", "Kro", "Pcow"])

  • rows (int): Number of rows in table

  • table_type (str): Table type (SWOF, SGOF, SGWFN)

  • correlation (str): Correlation family (COR, LET)

  • note (str): Usage guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Saturation endpoints don't sum correctly (Swc + Sor < 1.0)

  • Using wrong table type for simulation (check simulator requirements)

  • Corey exponents too high (>5) causing unrealistic curves

  • Not specifying required parameters for chosen table type

  • Too few rows (<10) causing poor curve resolution

  • Maximum rel perms > 1.0 (must be dimensionless 0-1)

Example Usage (Corey SWOF):

{
    "rows": 25,
    "krtable": "SWOF",
    "krfamily": "COR",
    "kromax": 1.0,
    "krwmax": 0.25,
    "swc": 0.15,
    "swcr": 0.2,
    "sorw": 0.15,
    "no": 2.5,
    "nw": 1.5
}

Example Usage (LET SGOF):

{
    "rows": 25,
    "krtable": "SGOF",
    "krfamily": "LET",
    "kromax": 1.0,
    "krgmax": 1.0,
    "swc": 0.2,
    "sorg": 0.15,
    "sgc": 0.1,
    "Lo": 2.5,
    "Eo": 1.25,
    "To": 1.75,
    "Lg": 1.2,
    "Eg": 1.5,
    "Tg": 2.0
}

Note: Relative permeability tables are critical for accurate simulation. Always validate endpoints against core data or literature. Use LET for history matching when Corey doesn't fit data well. Table format is ECLIPSE-compatible and ready for direct inclusion in simulation decks.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and does an excellent job explaining what the tool does: generates tables for reservoir simulation, describes the mathematical models (Corey and LET formulas), explains output format, and provides practical guidance. It doesn't mention rate limits, authentication needs, or computational cost, but covers the core behavior thoroughly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is comprehensive but quite long with multiple sections (Parameters, Correlation Families, Table Types, etc.). While all content is valuable, it could be more front-loaded with critical information. The structure is logical but not optimally concise for quick scanning by an AI agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool (multiple correlation models, table types, and many parameters) and the presence of an output schema, the description is exceptionally complete. It covers purpose, usage, parameters, mathematical background, workflow, return values, common mistakes, and examples. The output schema existence means the description doesn't need to detail return structure, allowing focus on conceptual guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0% (all parameters are in a nested 'request' object with no descriptions at the top level), but the description compensates fully with detailed parameter documentation. Each parameter gets clear explanations, typical ranges, examples, and context about when they're required (e.g., which parameters apply to Corey vs LET, SWOF vs SGOF). This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Generate relative permeability table for reservoir simulation' with specific details about creating saturation-dependent curves for named simulators (ECLIPSE, Intersect, CMG). It distinguishes from sibling tools by focusing on relative permeability table generation, which is unique among the listed reservoir engineering tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use different correlation families (Corey for quick estimates/standard cases, LET for history matching/complex curves), table types (SWOF for water-oil, SGOF for gas-oil, SGWFN for three-phase), and includes a detailed workflow section. It also lists common mistakes to avoid, giving clear usage boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_component_propertiesA

Get critical properties for hydrocarbon components from database.

COMPONENT DATABASE - Access to comprehensive database of critical properties for standard hydrocarbon components and common non-hydrocarbons. Essential for compositional analysis, EOS calculations, and phase behavior modeling.

Parameters:

  • component (str, required): Component name. Case-insensitive. Examples: "methane", "C1", "ethane", "C2", "propane", "C3", "n-butane", "nC4", "i-butane", "iC4", "benzene", "toluene", "N2", "CO2", "H2S", "H2O".

  • eos (str, optional, default="PR79"): Equation of State model. Options: "PR79", "PR77", "SRK", "RK". PR79 recommended.

Available Components:

  • Light Ends: Methane (C1), Ethane (C2), Propane (C3), Butane (C4), Pentane (C5)

  • Normal Paraffins: n-C4 through n-C45 (n-butane to n-pentatetracontane)

  • Branched Alkanes: iC4 (isobutane), iC5 (isopentane), neoC5 (neopentane)

  • Aromatics: Benzene (C6H6), Toluene (C7H8), Xylenes (C8H10)

  • Naphthenes: Cyclopentane, Cyclohexane

  • Non-Hydrocarbons: N2 (nitrogen), CO2 (carbon dioxide), H2S (hydrogen sulfide), H2O (water)

Properties Returned:

  • MW: Molecular weight in lb/lbmol. Example: 16.04 for methane.

  • Tc: Critical temperature in °R. Example: 343.0 for methane.

  • Pc: Critical pressure in psia. Example: 667.8 for methane.

  • Zc: Critical compressibility factor (dimensionless). Example: 0.286 for methane.

  • Omega: Acentric factor ω (dimensionless). Example: 0.011 for methane.

  • Vcritical: Critical volume in cuft/lbmol. Example: 1.59 for methane.

  • Tb: Normal boiling point in °R. Example: 201.6 for methane.

  • SG: Specific gravity (dimensionless, relative to water). Example: 0.554 for methane.

EOS Models:

  • PR79 (Peng-Robinson 1979): RECOMMENDED. Most widely used, best accuracy. Use for: Most applications, hydrocarbon systems, gas processing.

  • PR77 (Peng-Robinson 1977): Original version. Use for: Compatibility, older models.

  • SRK (Soave-Redlich-Kwong 1972): Alternative EOS. Use for: Specific applications, comparison.

  • RK (Redlich-Kwong 1949): Older EOS. Use for: Historical compatibility, simple systems.

Critical Properties Usage: Critical properties are essential for:

  • EOS phase behavior calculations (PR, SRK, RK)

  • Flash calculations (bubble point, dew point)

  • Phase envelope generation

  • Compressibility factor calculations

  • Vapor-liquid equilibrium

Applications:

  • Compositional Simulation: Input component properties for compositional models

  • EOS Phase Behavior: Calculate phase envelopes and phase boundaries

  • Flash Calculations: Solve vapor-liquid equilibrium problems

  • PVT Modeling: Build compositional PVT models

  • Gas Processing Design: Design separation and processing facilities

  • Material Balance: Compositional material balance calculations

Source: Industry-standard component database with properties from:

  • NIST (National Institute of Standards and Technology)

  • API (American Petroleum Institute) data

  • EOS calibrations and literature values

Returns: Dictionary with:

  • component (str): Component name

  • eos_model (str): EOS model used

  • properties (dict): All critical properties (MW, Tc, Pc, Zc, Omega, Vcritical, Tb, SG)

  • method (str): "Component database lookup"

  • note (str): Usage guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Component name misspelled (check spelling, try common aliases like "C1" for methane)

  • Wrong EOS model (use PR79 unless specific requirement)

  • Case sensitivity (component names are case-insensitive, but use standard capitalization)

  • Component not in database (check available components list)

  • Using properties from wrong EOS (properties are EOS-specific)

Example Usage:

{
    "component": "methane",
    "eos": "PR79"
}

Result: Returns all critical properties for methane calibrated for PR79 EOS.

Note: Component properties are EOS-specific. Always use properties from the same EOS model throughout your calculations. PR79 is recommended for most applications. For components not in database, use external sources or estimate from correlations.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and excels by disclosing key behavioral traits. It details the database source (NIST, API), explains that properties are EOS-specific, warns about common mistakes (e.g., misspellings, wrong EOS), and provides usage guidance (e.g., PR79 recommended). This goes beyond basic functionality to include operational context and limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose but includes extensive sections (e.g., 'Available Components,' 'EOS Models,' 'Applications') that, while informative, could be streamlined. Some sentences, like detailed lists of components, may not all earn their place for conciseness, though the structure is organized with headings for clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (database lookup with EOS-specific properties), no annotations, and an output schema present, the description is highly complete. It covers purpose, parameters, returned properties, usage scenarios, common mistakes, examples, and notes, providing all necessary context for an AI agent to use the tool effectively without relying on structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate fully. It does so by elaborating on both parameters: for 'component,' it provides examples, notes case-insensitivity, and lists available components; for 'eos,' it explains options, default, and recommendations. This adds significant meaning beyond the bare schema, ensuring parameters are well-understood.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get critical properties for hydrocarbon components from database.' It specifies the verb 'Get' and the resource 'critical properties for hydrocarbon components,' distinguishing it from sibling tools like 'gas_critical_properties' or 'oil_twu_critical_properties' by focusing on a database lookup for compositional analysis rather than calculations or specific fluid types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use this tool, such as for 'compositional analysis, EOS calculations, and phase behavior modeling,' and lists applications like 'Compositional Simulation' and 'Flash Calculations.' However, it does not explicitly state when not to use it or name specific alternatives among sibling tools, though it implies alternatives for components not in the database.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lorenz_from_flow_fractionsA

Calculate Lorenz coefficient from flow and permeability fractions.

LORENZ FROM PRODUCTION DATA - Computes Lorenz coefficient from layer-by-layer flow and permeability data. Essential for analyzing actual production data and quantifying vertical conformance from measured production allocation.

Parameters:

  • flow_frac (list, required): Flow fractions from each layer (0-1). Must sum to 1.0. Length must match perm_frac. Example: [0.1, 0.2, 0.3, 0.4].

  • perm_frac (list, required): Permeability-thickness fractions (kh fractions) for each layer (0-1). Must sum to 1.0. Length must match flow_frac. Example: [0.05, 0.15, 0.25, 0.55].

Input Data Sources:

  • PLT (Production Logging Tool): Flow rate per layer from production logs

  • Tracer Tests: Flow allocation from tracer response

  • Production Allocation: Flow rates from well test analysis

  • Core Data: Permeability and thickness from core analysis

  • Log Data: Permeability from well logs, thickness from formation tops

Lorenz Coefficient Calculation: Constructs Lorenz curve from data:

  1. Sort layers by kh fraction (ascending)

  2. Calculate cumulative kh fraction (x-axis)

  3. Calculate cumulative flow fraction (y-axis)

  4. Calculate area between curve and diagonal (45° line)

  5. L = 2 × area (normalized to 0-1)

Interpretation:

  • L < 0.3: High conformance (flow matches capacity)

  • L = 0.3-0.6: Moderate conformance (some flow imbalance)

  • L ≥ 0.6: Poor conformance (severe flow imbalance)

Applications:

  • Production Allocation Analysis: Quantify vertical conformance from PLT data

  • PLT Interpretation: Convert PLT flow rates to heterogeneity measure

  • Tracer Test Analysis: Evaluate sweep efficiency from tracer response

  • Vertical Conformance Evaluation: Assess waterflood performance

  • History Matching: Match simulation to measured production allocation

  • Performance Diagnosis: Identify layers with poor conformance

Returns: Dictionary with:

  • lorenz_coefficient (float): Lorenz coefficient (0-1)

  • number_of_layers (int): Number of layers analyzed

  • method (str): "Lorenz from flow and permeability fractions"

  • interpretation (str): Conformance level guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Flow fractions don't sum to 1.0 (must normalize)

  • Perm fractions don't sum to 1.0 (must normalize)

  • Length mismatch between flow_frac and perm_frac

  • Using weight fractions instead of flow fractions

  • Not sorting layers correctly (must sort by kh)

  • Using wrong kh calculation (must be k × h, not just k)

Example Usage:

{
    "flow_frac": [0.1, 0.2, 0.3, 0.4],
    "perm_frac": [0.05, 0.15, 0.25, 0.55]
}

Result: L ≈ 0.4-0.5 (moderate conformance - high-k layers produce more than their capacity fraction, low-k layers produce less).

Note: This is the most direct way to calculate Lorenz from actual production data. Always ensure fractions sum to 1.0 and layers are correctly matched. High L indicates poor vertical conformance (flow imbalance).

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and excels. It details the calculation algorithm step-by-step, provides interpretation guidelines (L < 0.3: high conformance, etc.), lists common mistakes with specific validation requirements (sum to 1.0, length match), and explains what the tool returns. This gives the agent comprehensive behavioral understanding.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Input Data Sources, Calculation, Interpretation, Applications, Returns, Common Mistakes, Example Usage, Note). While comprehensive, some sections like 'Applications' and 'Common Mistakes' are quite detailed, making it longer than minimal. However, every sentence adds value, and key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, 0% schema description coverage, but with an output schema, the description provides exceptional completeness. It covers purpose, usage, algorithm, interpretation, applications, parameters, returns (though output schema exists, it adds interpretation guidance), common mistakes, and examples. This fully compensates for the lack of structured metadata.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description provides extensive parameter semantics. It defines flow_frac and perm_frac with clear units (0-1 fractions), requirements (must sum to 1.0, length match), examples, and explains their physical meaning (flow fractions from production allocation, permeability-thickness fractions). It also clarifies common pitfalls like using weight fractions instead of flow fractions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates Lorenz coefficient from flow and permeability fractions, specifying it's for analyzing production data and quantifying vertical conformance. It distinguishes from sibling 'flow_fractions_from_lorenz' by being the inverse operation, and from 'beta_to_lorenz' and 'lorenz_to_beta' by using different input types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool ('most direct way to calculate Lorenz from actual production data') and provides extensive context through 'Input Data Sources' (PLT, tracer tests, etc.) and 'Applications' sections. It also implicitly contrasts with siblings by focusing on measured production allocation rather than theoretical distributions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lorenz_to_betaA

Convert Lorenz coefficient to Dykstra-Parsons beta parameter.

HETEROGENEITY QUANTIFICATION - Converts between two common measures of reservoir heterogeneity. Essential for comparing reservoirs using different heterogeneity metrics and for literature data conversion.

Parameters:

  • value (float, required): Lorenz coefficient (0-1). Must be 0 ≤ L ≤ 1. Typical: 0.2-0.7. Example: 0.5 for moderate heterogeneity.

Lorenz Coefficient (L):

  • Ranges from 0 (homogeneous) to 1 (completely heterogeneous)

  • Based on cumulative flow capacity vs cumulative storage capacity

  • Geometric interpretation: area between Lorenz curve and 45° line

  • L = 2 × area between curve and diagonal

  • Directly measurable from production data (PLT, tracer tests)

Dykstra-Parsons Beta (β):

  • Permeability variation coefficient (dimensionless, 0-1)

  • β = (k50 - k84.1) / k50

  • Based on log-normal permeability distribution

  • Requires permeability data (core, logs)

  • Common in literature and older studies

Conversion Relationship: Beta and Lorenz are related through log-normal distribution statistics. Higher Lorenz = higher Beta (both indicate more heterogeneity).

Typical Ranges:

  • L < 0.3 (homogeneous): β < 0.5

  • L = 0.3-0.6 (moderate): β = 0.5-0.7

  • L > 0.6 (heterogeneous): β > 0.7

Applications:

  • Waterflood Sweep Efficiency: Predict vertical sweep from heterogeneity

  • Vertical Conformance Analysis: Evaluate production allocation

  • Reservoir Characterization: Compare reservoirs using different metrics

  • Performance Prediction: Use beta in Dykstra-Parsons calculations

  • Literature Conversion: Convert published beta values to Lorenz

Returns: Dictionary with:

  • beta (float): Dykstra-Parsons beta coefficient (0-1)

  • lorenz_coefficient (float): Input Lorenz coefficient

  • method (str): "Lorenz to Dykstra-Parsons conversion"

  • interpretation (dict): Heterogeneity level guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Lorenz coefficient outside valid range (must be 0-1)

  • Confusing Lorenz with other heterogeneity measures

  • Using beta from wrong distribution (must be log-normal)

  • Not understanding that conversion is approximate (depends on distribution)

Example Usage:

{
    "value": 0.5
}

Result: β ≈ 0.6-0.7 (moderate to high heterogeneity).

Note: Conversion assumes log-normal permeability distribution. For non-log-normal distributions, conversion may be less accurate. Always validate against actual permeability data when possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains the tool's behavior: it converts between two heterogeneity measures, details the mathematical and statistical basis (log-normal distribution), includes typical ranges and interpretations, notes assumptions and limitations ('conversion is approximate'), and describes the return structure. This covers operational context, accuracy constraints, and output format comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (e.g., Parameters, Applications, Returns) and uses bullet points for readability. However, it is lengthy with detailed explanations (e.g., mathematical definitions, typical ranges) that, while informative, could be condensed for brevity. Every sentence adds value, but it borders on being overly verbose for a tool description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the conversion (involving statistical assumptions and reservoir engineering context), no annotations, and an output schema (implied by the Returns section), the description is highly complete. It covers purpose, usage, parameters, behavioral traits, limitations, examples, and return values, leaving no gaps for effective tool invocation by an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate. It adds extensive meaning beyond the schema: defines the 'value' parameter as a Lorenz coefficient (float, 0-1), explains its typical range (0.2-0.7), provides an example (0.5), and details its derivation and interpretation (e.g., based on cumulative flow vs. storage, geometric meaning). This fully documents the parameter's semantics and usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose: 'Convert Lorenz coefficient to Dykstra-Parsons beta parameter.' This is a specific verb ('Convert') with clear resources (Lorenz coefficient to Dykstra-Parsons beta), and it distinguishes from its sibling 'beta_to_lorenz' by specifying the direction of conversion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: 'Essential for comparing reservoirs using different heterogeneity metrics and for literature data conversion.' It also lists specific applications (e.g., waterflood sweep efficiency, reservoir characterization) and mentions an alternative ('beta_to_lorenz' as the inverse conversion), with clear context on its role in heterogeneity quantification.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_api_from_sgA

Convert oil specific gravity to API gravity.

UNIT CONVERSION TOOL - Converts oil specific gravity (dimensionless, water=1.0) to API gravity (degrees). API gravity is an inverse measure of density - higher API means lighter oil. Essential for standardizing oil property reporting.

Parameters:

  • sg (float or list, required): Oil specific gravity (water=1.0). Valid range: 0.1-1.5. Typical: 0.8-1.0. Example: 0.85 or [0.80, 0.85, 0.90]. Can be scalar or array.

Conversion Formula: API = (141.5 / SG) - 131.5

API Gravity Ranges:

  • Heavy oil: API < 22° (SG > 0.922)

  • Medium oil: API 22-35° (SG 0.922-0.850)

  • Light oil: API > 35° (SG < 0.850)

  • Water: API = 10° (SG = 1.0)

Returns: Dictionary with:

  • value (float or list): API gravity in degrees (matches input sg shape)

  • method (str): "Standard conversion"

  • units (str): "degrees API"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using gas specific gravity instead of oil specific gravity

  • Confusing API gravity with specific gravity (inverse relationship)

  • Using density (lb/cuft) instead of specific gravity

  • Not understanding that higher API = lighter oil

Example Usage:

{
    "sg": 0.85
}

Result: API = (141.5 / 0.85) - 131.5 ≈ 35.0° (medium gravity oil)

Note: API gravity is the industry standard for oil classification. Use this conversion when you have specific gravity but need API gravity for correlations or reporting.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It comprehensively describes the tool's behavior: it explains the conversion formula, valid input ranges (0.1-1.5), typical values (0.8-1.0), that inputs can be scalar or array, the return format (dictionary with specific fields), and includes practical context like API gravity ranges for oil classification. This goes well beyond basic parameter documentation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (UNIT CONVERSION TOOL, Parameters, Conversion Formula, etc.) and front-loads the core purpose. While comprehensive, some sections like 'Common Mistakes' and detailed API ranges could be considered slightly verbose, though they add value. Overall, it's efficiently organized with minimal wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (unit conversion with formula and industry context), no annotations, and an output schema that exists, the description is remarkably complete. It explains the conversion physics, provides the formula, input constraints, return format, usage context, common pitfalls, and example usage. The output schema handles return structure documentation, allowing the description to focus on semantic context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must fully compensate. It provides extensive parameter semantics: defines 'sg' as oil specific gravity with water=1.0, specifies it can be float or list, provides valid range (0.1-1.5), typical range (0.8-1.0), and gives examples (0.85 or [0.80, 0.85, 0.90]). This adds substantial meaning beyond what the bare schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Convert oil specific gravity to API gravity.' It specifies the exact transformation (conversion), the input (oil specific gravity), and the output (API gravity). It distinguishes itself from siblings by focusing on this specific conversion, unlike tools like 'oil_sg_from_api' which performs the inverse operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: 'Use this conversion when you have specific gravity but need API gravity for correlations or reporting.' It also provides 'Common Mistakes' section that implicitly guides when not to use it (e.g., for gas specific gravity or density instead of oil specific gravity), helping differentiate from sibling tools like 'gas_sg_from_composition' or 'oil_density'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_bubble_pointA

Calculate oil bubble point pressure (Pb).

CRITICAL PVT PROPERTY - The bubble point is the pressure at which gas first begins to evolve from solution in oil. Essential for all oil reservoir calculations.

Parameters:

  • api (float, required): Oil API gravity in degrees. Valid range: 0-100. Typical values: 20-50. Example: 35.0 for medium gravity crude.

  • degf (float, required): Reservoir temperature in degrees Fahrenheit. Valid range: -460 to 1000. Typical: 100-300°F. Example: 180.0.

  • rsb (float, required): Solution gas-oil ratio at bubble point in scf/stb. Must be ≥ 0. Typical: 100-3000 scf/stb. Example: 800.0.

  • sg_g (float, optional, default=0.0): Gas specific gravity (air=1.0). Valid range: 0-3. Typical: 0.6-1.2. Example: 0.75 for associated gas.

  • method (str, optional, default="VALMC"): Correlation method. Options: "STAN", "VALMC", "VELAR". VALMC recommended for wider applicability.

Method Selection:

  • VALMC (Valko-McCain 2003): Recommended. Best for wide range of conditions. Use for: Most applications, high GOR oils, wide temperature ranges.

  • STAN (Standing 1947): Classic correlation. Use for: Standard conditions, quick estimates, compatibility with older methods.

  • VELAR (Velarde 1997): Alternative method. Use for: Specific regional correlations, comparison studies.

Returns: Dictionary with:

  • value (float): Bubble point pressure in psia

  • method (str): Method used

  • units (str): "psia"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Confusing rsb (solution GOR at bubble point) with separator GOR

  • Using gas gravity from wrong separator stage

  • Temperature in Celsius instead of Fahrenheit

Example Usage:

{
    "api": 35.0,
    "degf": 180.0,
    "rsb": 800.0,
    "sg_g": 0.75,
    "method": "VALMC"
}

Expected result: Pb ≈ 3000-4000 psia for typical oil.

Note: If Pb > reservoir pressure, reservoir is undersaturated (no free gas). If Pb < reservoir pressure, reservoir is saturated (gas cap present).

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits: it explains the calculation's significance, lists parameter valid ranges and typical values, details method options with recommendations, describes the return dictionary structure, and warns of common errors. This covers all necessary aspects like input validation and output format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Method Selection, Returns, etc.), but it is somewhat lengthy. Every sentence adds value (e.g., the 'Common Mistakes' and 'Note' sections are highly informative), though it could be more front-loaded by moving key usage guidelines earlier.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple parameters with specific ranges, method choices) and no annotations, the description is complete: it explains the tool's purpose, parameters, methods, return values (though an output schema exists, it still clarifies the dictionary structure), usage context, and common pitfalls. No significant gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage (parameters are nested under 'request' with minimal schema descriptions), the description comprehensively documents all parameters: it defines each with units, valid ranges, typical values, examples, and practical notes (e.g., distinguishing rsb from separator GOR). This fully compensates for the schema's lack of detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates oil bubble point pressure (Pb), specifying it's a critical PVT property with a precise definition. It distinguishes itself from siblings like 'oil_rs_at_bubble_point' or 'oil_solution_gor' by focusing on pressure calculation rather than gas-oil ratio or other properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit guidance on when to use each correlation method (VALMC for wide applicability, STAN for standard conditions, VELAR for regional studies) and includes a 'Common Mistakes' section warning against misusing parameters like temperature units or GOR values. The note on Pb vs. reservoir pressure clarifies practical application contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_compressibilityA

Calculate oil compressibility (Co).

CRITICAL PVT PROPERTY - Computes oil compressibility coefficient, which measures how much oil volume changes with pressure. Essential for material balance calculations, pressure transient analysis, and reserve estimation. Co is typically 5-50 × 10⁻⁶ 1/psi.

Parameters:

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3000.0 or [2000, 3000, 4000].

  • api (float, required): Oil API gravity in degrees. Valid: 0-100. Example: 35.0.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 180.0.

  • pb (float, required): Bubble point pressure in psia. Must be ≥ 0. Example: 3500.0.

  • sg_g (float, required): Gas specific gravity (air=1). Valid: 0-3. Typical: 0.6-1.2. Example: 0.75.

  • rs (float or list, optional, default=0.0): Solution GOR at pressure p in scf/stb. If 0, will be calculated. Must match p shape. Example: 600.0.

  • rsb (float, optional, default=0.0): Solution GOR at bubble point in scf/stb. Required if pb provided. Example: 800.0.

Compressibility Behavior:

  • p < pb: Co is relatively constant (oil + dissolved gas compressibility)

  • p = pb: Co increases sharply (gas evolution begins)

  • p > pb: Co decreases with pressure (gas compressibility dominates)

Typical Ranges:

  • Undersaturated oil: 5-20 × 10⁻⁶ 1/psi

  • At bubble point: 20-50 × 10⁻⁶ 1/psi

  • Above bubble point: 10-30 × 10⁻⁶ 1/psi

Returns: Dictionary with:

  • value (float or list): Compressibility in 1/psi (matches input p shape)

  • method (str): "McCain"

  • units (str): "1/psi"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Not providing pb (required for accurate calculation)

  • Using wrong pressure (must be reservoir pressure, not separator)

  • Confusing oil compressibility with gas compressibility

  • Not accounting for dissolved gas effects

Example Usage:

{
    "p": [2000, 3000, 4000],
    "api": 35.0,
    "degf": 180.0,
    "pb": 3500.0,
    "sg_g": 0.75,
    "rs": [400, 600, 800],
    "rsb": 800.0
}

Result: Co ≈ 10-15 × 10⁻⁶ 1/psi below bubble point, increases near pb.

Note: Compressibility is critical for material balance calculations. Always provide pb for accurate results. Co values are small (micro-1/psi), so results are typically in scientific notation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it explains compressibility trends (p < pb, p = pb, p > pb), typical ranges, criticality of pb, and output structure. It adds context on numerical scale (micro-1/psi) and method used ('McCain'), which aren't in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections (CRITICAL PVT PROPERTY, Parameters, Compressibility Behavior, etc.), but slightly verbose. Every sentence adds value (e.g., typical ranges, common mistakes), though some redundancy exists (e.g., repeating pb importance). It's front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, 0% schema coverage, and an output schema, the description is highly complete: it covers purpose, usage, parameters, behavior, returns, examples, and pitfalls. The output schema handles return values, so the description appropriately focuses on context and semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates fully: it details each parameter (p, api, degf, pb, sg_g, rs, rsb) with meanings, valid ranges, examples, and interactions (e.g., rs matching p shape, rsb required if pb provided). This adds significant value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates oil compressibility (Co), specifying it's a critical PVT property that measures volume change with pressure. It distinguishes from siblings like gas_compressibility by focusing on oil and mentions specific applications (material balance, pressure transient analysis).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: it states when to use (essential for material balance calculations, etc.), distinguishes from gas compressibility, and warns against common mistakes like using wrong pressure types. It also references sibling tools (e.g., oil_bubble_point for pb) implicitly through parameter context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_densityA

Calculate oil density (ρo) at reservoir conditions.

CRITICAL PVT PROPERTY - Computes oil density from PVT properties using mass balance approach. Essential for gradient calculations, well pressure analysis, and material balance calculations.

Parameters:

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3000.0.

  • api (float, required): Oil API gravity in degrees. Valid: 0-100. Example: 35.0.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 180.0.

  • rs (float or list, required): Solution GOR at pressure p in scf/stb. Must match p shape. Example: 600.0 or [400, 600, 800].

  • sg_g (float, required): Gas specific gravity (air=1). Valid: 0-3. Typical: 0.6-1.2. Example: 0.75.

  • bo (float or list, required): Oil formation volume factor at pressure p in rb/stb. Must match p shape. Calculate using oil_formation_volume_factor tool first. Example: 1.25 or [1.15, 1.25, 1.30].

Calculation Method: Density = (Stock tank oil mass + Dissolved gas mass) / Reservoir volume ρo = (sg_o × 62.372 + 0.01357 × Rs × sg_g) / Bo

Where:

  • sg_o = oil specific gravity (calculated from API)

  • 62.372 = water density at standard conditions (lb/cuft)

  • 0.01357 = gas density conversion factor

Typical Ranges:

  • Light oils: 40-50 lb/cuft

  • Medium oils: 50-55 lb/cuft

  • Heavy oils: 55-65 lb/cuft

Returns: Dictionary with:

  • value (float or list): Density in lb/cuft (matches input p shape)

  • method (str): "Standard"

  • units (str): "lb/cuft"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using stock tank density instead of reservoir density

  • Not providing matching rs and bo arrays

  • Using wrong bo value (must be at same pressure as p)

  • Confusing density (mass/volume) with specific gravity (dimensionless)

Example Usage:

{
    "p": 3000.0,
    "api": 35.0,
    "degf": 180.0,
    "rs": 600.0,
    "sg_g": 0.75,
    "bo": 1.25
}

Result: Density ≈ 48-52 lb/cuft for typical medium gravity oil.

Note: Always calculate Bo first using oil_formation_volume_factor tool, then use matching rs and bo values for accurate density calculation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits. It explains the calculation method, typical ranges, return format, and critical notes like parameter matching requirements. It adds context on prerequisites (calculating Bo first) and validation rules (e.g., p > 0), which are not in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Calculation Method, Returns, etc.), but it is lengthy. Every sentence earns its place by providing essential information, though it could be more front-loaded; the critical purpose is stated early, but detailed sections follow, which is acceptable given the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 parameters, no annotations, 0% schema coverage, but with an output schema), the description is highly complete. It covers purpose, usage, parameters, method, returns, examples, and common mistakes. The output schema exists, so the description appropriately focuses on input semantics and behavioral context without needing to explain return values in detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates fully. Each parameter is detailed with meaning, units, valid ranges, examples, and constraints (e.g., 'Must match p shape'). It explains relationships between parameters (e.g., rs and bo must match p) and provides the underlying formula, adding significant value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates oil density at reservoir conditions using a mass balance approach, specifying it's for PVT properties. It distinguishes from siblings like 'gas_density' and 'oil_formation_volume_factor' by focusing specifically on oil density calculation, not gas properties or volume factors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: 'Always calculate Bo first using oil_formation_volume_factor tool, then use matching rs and bo values.' It also lists common mistakes to avoid, such as using stock tank density instead of reservoir density, which helps differentiate when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_formation_volume_factorA

Calculate oil formation volume factor (Bo).

CRITICAL PVT PROPERTY - Computes ratio of oil volume at reservoir conditions to volume at standard conditions. Bo > 1.0 because oil expands due to dissolved gas and thermal expansion. Essential for material balance, reserve calculations, and production forecasting.

Parameters:

  • api (float, required): Oil API gravity in degrees. Valid: 0-100. Example: 35.0.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 180.0.

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3000.0 or [2000, 3000, 4000].

  • sg_g (float, optional, default=0.0): Gas specific gravity (air=1). Valid: 0-3. Typical: 0.6-1.2. Example: 0.75.

  • pb (float, optional, default=0.0): Bubble point pressure in psia. Required for accurate calculation. Example: 3500.0.

  • rs (float or list, optional, default=0.0): Solution GOR at pressure p in scf/stb. If 0, will be calculated from p. Must match p shape. Example: 600.0 or [400, 600, 800].

  • rsb (float, optional, default=0.0): Solution GOR at bubble point in scf/stb. Required if pb provided. Example: 800.0.

  • method (str, optional, default="MCAIN"): Correlation method. Options: "MCAIN", "STAN". MCAIN recommended.

Pressure Behavior:

  • p < pb: Bo increases with pressure (more gas dissolves)

  • p = pb: Bo reaches maximum (Bob, typically 1.2-2.0 rb/stb)

  • p > pb: Bo decreases with pressure (oil compressibility dominates)

Method Selection:

  • MCAIN (McCain et al. 1988): Recommended. More accurate, wider range.

  • STAN (Standing 1947): Classic method. Use for compatibility.

Returns: Dictionary with:

  • value (float or list): Bo in rb/stb (matches input p shape)

  • method (str): Method used

  • units (str): "rb/stb"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Not providing rs when p < pb (will calculate incorrectly)

  • Using separator GOR instead of solution GOR at reservoir pressure

  • Pressure in barg/psig instead of psia

  • Confusing Bo (reservoir volume) with Bg (gas FVF)

Example Usage:

{
    "api": 35.0,
    "degf": 180.0,
    "p": [2000, 3000, 4000],
    "sg_g": 0.75,
    "pb": 3500.0,
    "rs": [400, 600, 800],
    "rsb": 800.0,
    "method": "MCAIN"
}

Result: Bo increases from ~1.15 rb/stb at 2000 psia to ~1.35 rb/stb at 3500 psia, then decreases to ~1.33 rb/stb at 4000 psia (above bubble point).

Note: Always provide rs for pressures below bubble point. If rs=0, tool will calculate it, but providing it explicitly improves accuracy.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and excels. It explains critical behavioral aspects: pressure behavior (how Bo changes with p relative to pb), method differences (accuracy ranges), return format (dictionary structure), common mistakes (e.g., unit confusion), and accuracy implications (providing rs improves results). This goes far beyond basic parameter documentation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Pressure Behavior, Method Selection, Returns, Common Mistakes, Example Usage) and uses bold headings effectively. While lengthy, every sentence adds value—no fluff. It could be slightly more front-loaded by moving the example earlier, but overall it's efficiently organized for a complex tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, nuanced physics), no annotations, but with an output schema, the description is exceptionally complete. It covers purpose, usage, parameters, behavior, method selection, returns, common pitfalls, and includes a detailed example. The output schema handles return structure, allowing the description to focus on conceptual and practical aspects without redundancy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description comprehensively documents all 8 parameters. It adds essential semantics: validity ranges, examples, default values, shape matching requirements (rs must match p), and practical guidance (e.g., 'Required for accurate calculation' for pb). This fully compensates for the schema gap and provides rich context for each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculate oil formation volume factor (Bo)' and elaborates on its definition and importance. It distinguishes from siblings like gas_formation_volume_factor by specifying it's for oil, not gas, and from oil_density or oil_viscosity by focusing on volume ratio calculations for reservoir engineering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool versus alternatives. It distinguishes from gas FVF (Bg) in 'Common Mistakes', mentions method selection (MCAIN vs. STAN), and advises on providing rs for pressures below bubble point. It also implicitly positions it among sibling PVT tools by specifying its role in material balance and production forecasting.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_rate_linearA

Calculate oil production rate for linear flow.

INFLOW PERFORMANCE TOOL - Computes oil production rate for horizontal wells or wells with linear flow geometry using Darcy's law. Automatically calculates PVT properties (Rs, Bo, μo) at average pressure. Essential for horizontal well performance analysis and completion design.

Parameters:

  • pi (float, required): Initial/reservoir pressure in psia. Must be > 0. Example: 4000.0.

  • pb (float, required): Bubble point pressure in psia. Must be ≥ 0. Example: 3500.0. If pi < pb, reservoir is saturated (gas cap present).

  • api (float, required): Oil API gravity in degrees. Valid: 0-100. Example: 35.0.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 180.0.

  • sg_g (float, required): Gas specific gravity (air=1). Valid: 0-3. Typical: 0.6-1.2. Example: 0.75.

  • psd (float or list, required): Sandface/draining pressure(s) in psia. Must be > 0 and < pi. Can be scalar or array. Example: 1500.0 or [1000, 1500, 2000].

  • h (float, required): Net pay thickness in feet. Must be > 0. Typical: 10-200 ft. Example: 50.0.

  • k (float, required): Permeability in millidarcies (mD). Must be > 0. Typical: 1-1000 mD. Example: 100.0.

  • area (float, required): Cross-sectional flow area in square feet. Must be > 0. Typical: 100-10000 ft². Example: 1000.0.

  • length (float, required): Flow length in feet. Must be > 0. Typical: 100-5000 ft. Example: 500.0.

  • rsb (float, required): Solution GOR at bubble point in scf/stb. Must be ≥ 0. Example: 800.0.

Flow Geometry: Linear flow occurs in:

  • Horizontal wells (early-time flow)

  • Hydraulically fractured vertical wells (fracture flow)

  • Channelized reservoirs

  • Edge water drive systems

Darcy's Law Formula (Linear): qo = (0.001127 × k × area × (pi - pwf)) / (μo × Bo × length)

Where PVT properties (μo, Bo) are calculated at average pressure (pi + pwf)/2.

Linear vs Radial Flow:

  • Linear: Flow perpendicular to wellbore (horizontal wells)

  • Radial: Flow converging to wellbore (vertical wells)

  • Linear flow typically has higher productivity than radial

Returns: Dictionary with:

  • value (float or list): Oil rate in STB/day (matches input psd shape)

  • method (str): "Darcy linear flow"

  • units (str): "STB/day"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Confusing flow area (perpendicular to flow) with wellbore area

  • Using wrong flow length (should be distance from boundary to well)

  • Not accounting for net pay thickness correctly

  • Confusing linear flow (horizontal wells) with radial flow (vertical wells)

Example Usage:

{
    "pi": 4000.0,
    "pb": 3500.0,
    "api": 35.0,
    "degf": 180.0,
    "sg_g": 0.75,
    "psd": [1500, 2000, 2500],
    "h": 50.0,
    "k": 100.0,
    "area": 1000.0,
    "length": 500.0,
    "rsb": 800.0
}

Result: Oil rate decreases as sandface pressure increases (typical IPR curve).

Note: This tool automatically calculates PVT properties. You don't need to provide Rs, Bo, or μo - they are computed internally at average pressure. Linear flow is characteristic of horizontal wells and hydraulically fractured wells.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and excels. It discloses that the tool automatically calculates PVT properties internally, explains the Darcy's law formula used, describes the return format in detail, and warns about common implementation errors like pressure unit requirements and geometry misunderstandings.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Flow Geometry, Formula, Returns, Common Mistakes, Example) but is quite lengthy. While every section adds value, some information could be more condensed. It's front-loaded with the core purpose, but the detailed parameter explanations make it longer than ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 11 parameters, no annotations, and 0% schema coverage, the description is exceptionally complete. It covers purpose, usage context, mathematical basis, parameter details, return format, common pitfalls, and includes a working example. The output schema exists, so the description appropriately focuses on behavioral context rather than repeating return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description provides comprehensive parameter documentation. Each parameter gets a clear explanation with units, validity ranges, typical values, examples, and contextual notes (e.g., 'If pi < pb, reservoir is saturated'). This fully compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates oil production rate for linear flow using Darcy's law, specifying it's for horizontal wells or wells with linear flow geometry. It distinguishes from sibling tools like 'oil_rate_radial' by explicitly contrasting linear vs radial flow in a dedicated section.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool (horizontal wells, hydraulically fractured wells, channelized reservoirs, edge water drive systems) and when not to use it (radial flow for vertical wells). It includes a 'Common Mistakes' section that helps avoid misuse, such as confusing linear with radial flow or using wrong pressure units.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_rate_radialA

Calculate oil production rate for radial flow (vertical well).

INFLOW PERFORMANCE TOOL - Computes oil production rate for vertical wells with radial flow geometry using Darcy's law. Automatically calculates PVT properties (Rs, Bo, μo) at average pressure. Optionally applies Vogel IPR model for two-phase flow below bubble point.

Parameters:

  • pi (float, required): Initial/reservoir pressure in psia. Must be > 0. Example: 4000.0.

  • pb (float, required): Bubble point pressure in psia. Must be ≥ 0. Example: 3500.0. If pi < pb, reservoir is saturated (gas cap present).

  • api (float, required): Oil API gravity in degrees. Valid: 0-100. Example: 35.0.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 180.0.

  • sg_g (float, required): Gas specific gravity (air=1). Valid: 0-3. Typical: 0.6-1.2. Example: 0.75.

  • psd (float or list, required): Sandface/draining pressure(s) in psia. Must be > 0 and < pi. Can be scalar or array. Example: 1500.0 or [1000, 1500, 2000].

  • h (float, required): Net pay thickness in feet. Must be > 0. Typical: 10-200 ft. Example: 50.0.

  • k (float, required): Permeability in millidarcies (mD). Must be > 0. Typical: 1-1000 mD. Example: 100.0.

  • s (float, optional, default=0.0): Skin factor (dimensionless). Negative = stimulation, positive = damage. Typical: -5 to +20. Example: 0.0 for undamaged well.

  • re (float, required): Drainage radius in feet. Must be > rw. Typical: 500-5000 ft. Example: 1000.0.

  • rw (float, required): Wellbore radius in feet. Must be > 0. Typical: 0.25-0.5 ft. Example: 0.5.

  • rsb (float, required): Solution GOR at bubble point in scf/stb. Must be ≥ 0. Example: 800.0.

  • vogel (bool, optional, default=False): Apply Vogel IPR model. Set True when pi < pb (saturated reservoir). Example: False.

Flow Regime:

  • Undersaturated (pi > pb): Single-phase oil flow, Darcy's law applies

  • Saturated (pi < pb): Two-phase flow, use Vogel=True for accurate IPR

Darcy's Law Formula: qo = (0.00708 × k × h × (pi - pwf)) / (μo × Bo × (ln(re/rw) + S))

Where PVT properties (μo, Bo) are calculated at average pressure (pi + pwf)/2.

Returns: Dictionary with:

  • value (float or list): Oil rate in STB/day (matches input psd shape)

  • method (str): "Darcy radial flow" or "Vogel IPR"

  • units (str): "STB/day"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator temperature instead of reservoir temperature

  • Pressure in barg/psig instead of psia (must be absolute)

  • Not setting vogel=True when pi < pb (underestimates rate)

  • Using wrong drainage radius (re) - should be well spacing/2

  • Confusing net pay (h) with gross thickness

  • Not accounting for skin factor (s)

Example Usage:

{
    "pi": 4000.0,
    "pb": 3500.0,
    "api": 35.0,
    "degf": 180.0,
    "sg_g": 0.75,
    "psd": [1500, 2000, 2500],
    "h": 50.0,
    "k": 100.0,
    "s": 0.0,
    "re": 1000.0,
    "rw": 0.5,
    "rsb": 800.0,
    "vogel": False
}

Result: Oil rate decreases as sandface pressure increases (typical IPR curve).

Note: This tool automatically calculates PVT properties. You don't need to provide Rs, Bo, or μo - they are computed internally at average pressure. For saturated reservoirs (pi < pb), set vogel=True for accurate two-phase flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and delivers comprehensive behavioral information. It discloses that the tool automatically calculates PVT properties, explains the mathematical formula used, describes return format, provides example usage, and details flow regime behaviors. No contradictions exist since annotations are absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Flow Regime, Formula, Returns, Common Mistakes, Example Usage, Note) but could be more concise. Some information is repeated (e.g., Vogel usage mentioned multiple times), and the length is substantial though justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (13 parameters, engineering calculations) and absence of annotations, the description provides complete context. It covers purpose, usage, parameters, behavior, formula, return format, common mistakes, and examples. The output schema exists, so return values needn't be fully explained in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description provides extensive parameter semantics beyond what the schema offers. Each parameter gets detailed explanations including physical meaning, units, valid ranges, typical values, examples, and practical implications (e.g., 'If pi < pb, reservoir is saturated'). This fully compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool calculates oil production rate for vertical wells with radial flow geometry using Darcy's law, distinguishing it from sibling tools like 'oil_rate_linear' and specifying it's for 'vertical well' scenarios. It clearly identifies the verb ('calculate'), resource ('oil production rate'), and specific application context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool versus alternatives, including flow regime conditions (undersaturated vs saturated reservoirs), when to apply the Vogel IPR model, and common mistakes to avoid. It distinguishes usage from other tools by specifying radial flow geometry for vertical wells.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_rs_at_bubble_pointA

Calculate solution GOR at bubble point using Standing correlation.

Computes Rs specifically at the bubble point pressure based on reservoir fluid properties. Uses Standing (1947) correlation.

This is useful when you know the bubble point pressure and need to calculate the corresponding solution GOR.

Returns Rs in scf/stb.

Args: request: Bubble point parameters (API, temperature, bubble point, gas gravity)

Returns: Dictionary with Rs at bubble point, method, units, and inputs

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses the calculation method (Standing 1947 correlation) and return format (dictionary with Rs, method, units, inputs), which is helpful. However, it doesn't mention error conditions, numerical precision, validation of inputs, or whether the calculation is deterministic - important behavioral aspects for a computational tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with purpose, method, usage context, return format, and parameter explanation in logical order. Every sentence earns its place, though the Args/Returns section could be slightly more integrated with the main description rather than appearing as separate documentation blocks.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given this is a computational tool with no annotations but with an output schema (implied by 'Returns' section), the description provides good coverage. It explains what the tool does, when to use it, the method employed, return format, and parameter meanings. The main gap is lack of error handling or edge case information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0% (no parameter descriptions in schema), so the description must compensate. It successfully explains that parameters represent 'bubble point parameters (API, temperature, bubble point, gas gravity)' and clarifies the purpose of each in the context of the calculation. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific verb 'calculate' and resource 'solution GOR at bubble point', explicitly naming the Standing correlation method. It distinguishes from sibling tools like 'oil_bubble_point' (which likely calculates pressure rather than GOR) and 'oil_solution_gor' (which may calculate GOR at other conditions).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: 'when you know the bubble point pressure and need to calculate the corresponding solution GOR.' However, it doesn't explicitly mention when NOT to use it or name specific alternative tools from the sibling list that might be relevant for different scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_sg_from_apiA

Convert API gravity to oil specific gravity.

UNIT CONVERSION TOOL - Converts API gravity (degrees) to specific gravity (dimensionless, water=1.0). Specific gravity is the ratio of oil density to water density at standard conditions. Essential for calculations requiring specific gravity.

Parameters:

  • api (float or list, required): Oil API gravity in degrees. Valid range: 0-100. Typical: 20-50. Example: 35.0 or [30, 35, 40]. Can be scalar or array.

Conversion Formula: SG = 141.5 / (API + 131.5)

Specific Gravity Ranges:

  • Heavy oil: SG > 0.922 (API < 22°)

  • Medium oil: SG 0.850-0.922 (API 22-35°)

  • Light oil: SG < 0.850 (API > 35°)

  • Water: SG = 1.0 (API = 10°)

Returns: Dictionary with:

  • value (float or list): Specific gravity (dimensionless, matches input api shape)

  • method (str): "Standard conversion"

  • units (str): "dimensionless (water=1)"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using gas API gravity instead of oil API gravity

  • Confusing API gravity with specific gravity (inverse relationship)

  • Not understanding that lower SG = lighter oil (higher API)

  • Using wrong conversion formula

Example Usage:

{
    "api": 35.0
}

Result: SG = 141.5 / (35.0 + 131.5) ≈ 0.850 (medium gravity oil)

Note: Most PVT correlations use API gravity directly, but some require specific gravity. Use this conversion when needed. Remember: API and SG are inversely related - higher API means lower SG (lighter oil).

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains the tool's behavior: the conversion formula, valid input ranges (0-100), typical ranges (20-50), support for scalar or array inputs, return structure (dictionary with value, method, units, inputs), and specific gravity ranges with oil classifications. It also covers common mistakes and the inverse relationship between API and SG.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (UNIT CONVERSION TOOL, Parameters, Conversion Formula, etc.) and front-loads the core purpose. However, it includes some redundant information (e.g., repeating the inverse relationship in multiple places) and the 'Common Mistakes' section, while helpful, adds length. Every sentence earns its place, but minor trimming could improve conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (unit conversion with mathematical formula), no annotations, and 0% schema coverage, the description provides complete context. It explains the conversion physics, provides the formula, input constraints, return format, usage examples, and common pitfalls. The presence of an output schema reduces the need to explain return values, but the description still thoroughly documents the tool's behavior and context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage (the schema only says 'API gravity (degrees) - scalar or array'), the description fully compensates by providing rich parameter semantics. It explains the 'api' parameter as 'Oil API gravity in degrees,' specifies valid range (0-100), typical range (20-50), shows examples (35.0 or [30, 35, 40]), and clarifies it can be scalar or array. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Convert API gravity to oil specific gravity.' It specifies the exact conversion (API degrees to specific gravity dimensionless) and distinguishes it from sibling tools like 'oil_api_from_sg' (inverse conversion) and 'oil_sg_from_jacoby' (different method). The description explicitly mentions this is for oil, not gas, further differentiating from gas-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: 'Essential for calculations requiring specific gravity' and 'Use this conversion when needed.' It also warns against common mistakes like using gas API gravity instead of oil, and notes that 'Most PVT correlations use API gravity directly, but some require specific gravity.' This gives clear context for when this conversion is necessary versus when to use API gravity directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_sg_from_jacobyA

Calculate oil specific gravity from molecular weight and Jacoby aromaticity.

HYDROCARBON CHARACTERIZATION TOOL - Estimates specific gravity for undefined petroleum fractions using molecular weight and aromaticity.

Jacoby Aromaticity Factor (JA):

  • 0.0 = Pure paraffinic (alkanes)

  • 0.5 = Mixed (typical crude oils)

  • 1.0 = Pure aromatic

Applications:

  • Plus fraction (C7+) characterization

  • Undefined heavy end lumping

  • EOS fluid modeling

  • Pseudo-component generation

Returns specific gravity (dimensionless, water=1).

Args: request: Molecular weight and Jacoby aromaticity factor

Returns: Dictionary with specific gravity, method, and inputs

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the tool's behavior: it 'Estimates specific gravity' (clarifying it's an estimation), explains the Jacoby aromaticity factor scale, and states the return format ('Returns specific gravity (dimensionless, water=1)' and 'Dictionary with specific gravity, method, and inputs'). It lacks details on error handling or computational limits, but covers core behavioral aspects well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bold headings and bullet points, making it easy to scan. It is appropriately sized, with every sentence adding value (e.g., explaining the tool's purpose, factor scale, applications, and returns). A minor point: the 'Args' and 'Returns' sections slightly repeat information from earlier, but overall it's efficient and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (involving specialized petroleum engineering calculations), no annotations, and an output schema present, the description is complete enough. It covers purpose, parameter semantics, usage context, and behavioral details like the estimation nature and return format. The output schema handles return values, so the description doesn't need to explain them further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate fully. It adds significant meaning beyond the schema: it explains that 'mw' is 'Molecular weight (lb/lbmol)' and 'ja' is the 'Jacoby aromaticity factor' with a detailed scale (0.0 to 1.0), including interpretations like '0.0 = Pure paraffinic' and '1.0 = Pure aromatic.' This provides essential context not in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculate oil specific gravity from molecular weight and Jacoby aromaticity.' It specifies the verb ('Calculate'), resource ('oil specific gravity'), and method ('from molecular weight and Jacoby aromaticity'), distinguishing it from sibling tools like 'oil_sg_from_api' or 'gas_sg_from_composition' that use different inputs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool through the 'Applications' section, listing specific scenarios like 'Plus fraction (C7+) characterization' and 'EOS fluid modeling.' However, it does not explicitly state when not to use it or name alternative tools (e.g., 'oil_sg_from_api'), though the context implies it's for undefined petroleum fractions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_solution_gorA

Calculate solution gas-oil ratio (Rs) at specified pressure.

CRITICAL PVT PROPERTY - Computes volume of gas dissolved in oil at given pressure and temperature. Rs increases with pressure up to bubble point, then remains constant (equal to rsb) above bubble point.

Parameters:

  • api (float, required): Oil API gravity in degrees. Valid: 0-100. Example: 35.0.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 180.0.

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3000.0 or [2000, 3000, 4000].

  • sg_g (float, optional, default=0.0): Separator gas specific gravity (air=1). Valid: 0-3. Typical: 0.6-1.2. Example: 0.75.

  • pb (float, optional, default=0.0): Bubble point pressure in psia. If 0, will be calculated. Must be ≥ 0. Example: 3500.0.

  • rsb (float, optional, default=0.0): Solution GOR at bubble point in scf/stb. If 0 and pb provided, will be calculated. Must be ≥ 0. Example: 800.0.

  • method (str, optional, default="VELAR"): Correlation method. Options: "VELAR", "STAN", "VALMC".

Pressure Behavior:

  • p < pb: Rs calculated from correlation (increases with pressure)

  • p ≥ pb: Rs = rsb (constant, no additional gas dissolves)

Method Selection:

  • VELAR (Velarde 1997): Default, good accuracy. Use for most cases.

  • STAN (Standing 1947): Classic, widely used. Use for compatibility.

  • VALMC (Valko-McCain 2003): Alternative method.

Returns: Dictionary with:

  • value (float or list): Rs in scf/stb (matches input p shape)

  • method (str): Method used

  • units (str): "scf/stb"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using separator gas gravity instead of separator gas gravity (sg_g parameter)

  • Not providing pb when p > pb (will calculate incorrectly)

  • Pressure in barg/psig instead of psia (must be absolute)

  • Confusing rsb (at bubble point) with separator GOR

Example Usage:

{
    "api": 35.0,
    "degf": 180.0,
    "p": [2000, 3000, 4000],
    "sg_g": 0.75,
    "pb": 3500.0,
    "rsb": 800.0,
    "method": "VELAR"
}

Result: Rs increases from ~400 scf/stb at 2000 psia to 800 scf/stb at 3500 psia, then remains 800 scf/stb at 4000 psia (above bubble point).

Note: Always provide pb and rsb when available for accurate results. If unknown, set pb=0 and rsb=0 to auto-calculate, but accuracy may be reduced.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains the tool's behavior: how Rs changes with pressure (increases up to bubble point then constant), method options and their characteristics, return format, accuracy considerations, and critical implementation details like pressure units and parameter dependencies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Pressure Behavior, Method Selection, Returns, Common Mistakes, Example Usage, Note) but is quite lengthy. While every section adds value, some redundancy exists (e.g., parameter details are repeated in example). It could be more concise while maintaining clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is exceptionally complete for this complex tool. It covers purpose, parameters, behavior, method selection, return format, common pitfalls, and usage examples. Despite having an output schema, the description usefully explains the return structure. No significant gaps exist given the tool's complexity and lack of annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Given 0% schema description coverage, the description fully compensates by providing detailed parameter documentation. Each parameter is explained with purpose, valid ranges, examples, default values, and practical guidance. The description adds significant meaning beyond what the bare schema provides, including parameter interactions and calculation implications.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculate solution gas-oil ratio (Rs) at specified pressure.' It specifies the verb ('calculate'), resource ('solution gas-oil ratio'), and scope ('at specified pressure'), distinguishing it from sibling tools like 'oil_rs_at_bubble_point' which focuses only on bubble point conditions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool, including method selection recommendations (e.g., 'VELAR... Use for most cases'), pressure behavior rules ('p < pb' vs 'p ≥ pb'), and common mistakes to avoid. It also distinguishes usage from related tools by explaining the pressure-dependent behavior of Rs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_twu_critical_propertiesA

Calculate critical properties using Twu (1984) correlation.

CRITICAL PROPERTIES ESTIMATION - Most widely used method for estimating Tc, Pc, Vc for petroleum fractions and plus fractions.

Twu Method:

  • More accurate than older correlations (Riazi-Daubert, Kesler-Lee)

  • Uses molecular weight and specific gravity

  • Optional boiling point for improved accuracy

  • Damping factor for heavy ends

Returns:

  • Tc: Critical temperature (°R)

  • Pc: Critical pressure (psia)

  • Vc: Critical volume (cuft/lbmol)

  • Also returns: SG, Tb (if not provided)

Critical for:

  • EOS (PR, SRK) fluid characterization

  • Plus fraction splitting

  • Compositional simulation

  • Phase behavior modeling

Args: request: Molecular weight, specific gravity, optional boiling point, damping

Returns: Dictionary with all critical properties

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool performs calculations (not destructive), returns specific properties, and mentions accuracy improvements with optional boiling point and damping factor. However, it lacks details on error handling, performance characteristics, or rate limits, which would be helpful for a computational tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bold headers and bullet points, making it easy to scan. It's appropriately sized for a specialized tool, though some sections like 'Critical for:' could be more concise. Every sentence adds value, but minor trimming could improve efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (critical property estimation), no annotations, and an output schema present, the description is fairly complete. It covers purpose, method, parameters, returns, and applications. However, it could benefit from more behavioral details (e.g., computational limits) since annotations are absent, and the output schema handles return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaningful context: parameters are 'Molecular weight, specific gravity, optional boiling point, damping' and explains their roles ('Uses molecular weight and specific gravity', 'Optional boiling point for improved accuracy', 'Damping factor for heavy ends'). This clarifies beyond the schema's technical definitions, though it doesn't detail array handling or default values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculate critical properties using Twu (1984) correlation.' It specifies the exact method (Twu 1984), the properties calculated (Tc, Pc, Vc), and distinguishes it from siblings like 'gas_critical_properties' by focusing on petroleum fractions and plus fractions with the Twu method.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: 'Most widely used method for estimating Tc, Pc, Vc for petroleum fractions and plus fractions' and 'Critical for: EOS (PR, SRK) fluid characterization, Plus fraction splitting, Compositional simulation, Phase behavior modeling.' It doesn't explicitly state when not to use it or name alternatives, but the context is sufficient for informed selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

oil_viscosityA

Calculate oil viscosity (μo).

CRITICAL PVT PROPERTY - Computes oil viscosity at reservoir conditions. Viscosity affects flow rates, pressure drops, and recovery efficiency. Uses Beggs-Robinson (1975) correlation, industry standard for oil viscosity.

Parameters:

  • api (float, required): Oil API gravity in degrees. Valid: 0-100. Example: 35.0. Higher API = lighter oil = lower viscosity.

  • degf (float, required): Reservoir temperature in °F. Valid: -460 to 1000. Example: 180.0. Higher temperature = lower viscosity.

  • p (float or list, required): Pressure(s) in psia. Must be > 0. Can be scalar or array. Example: 3000.0 or [2000, 3000, 4000].

  • pb (float, optional, default=0.0): Bubble point pressure in psia. Required for accurate calculation. Example: 3500.0.

  • rs (float or list, optional, default=0.0): Solution GOR at pressure p in scf/stb. If 0, will be calculated. Must match p shape. Example: 600.0.

  • rsb (float, optional, default=0.0): Solution GOR at bubble point in scf/stb. Required if pb provided. Example: 800.0.

  • method (str, optional, default="BR"): Correlation method. Only "BR" available.

Viscosity Behavior:

  • p < pb: Viscosity decreases with pressure (more gas dissolves, oil thins)

  • p = pb: Viscosity reaches minimum (μob, typically 0.5-5 cP)

  • p > pb: Viscosity increases with pressure (oil compression)

Typical Ranges:

  • Light oils (API > 35): 0.5-2 cP at bubble point

  • Medium oils (API 25-35): 1-10 cP at bubble point

  • Heavy oils (API < 25): 10-1000+ cP at bubble point

Returns: Dictionary with:

  • value (float or list): Viscosity in cP (matches input p shape)

  • method (str): "BR" (Beggs-Robinson)

  • units (str): "cP"

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Not providing rs when p < pb (will calculate incorrectly)

  • Using dead oil viscosity instead of live oil viscosity

  • Temperature in Celsius instead of Fahrenheit

  • Pressure in barg/psig instead of psia

Example Usage:

{
    "api": 35.0,
    "degf": 180.0,
    "p": [2000, 3000, 4000],
    "pb": 3500.0,
    "rs": [400, 600, 800],
    "rsb": 800.0,
    "method": "BR"
}

Result: Viscosity decreases from ~1.2 cP at 2000 psia to ~0.8 cP at 3500 psia, then increases to ~0.85 cP at 4000 psia (above bubble point).

Note: Viscosity is highly sensitive to temperature and dissolved gas content. Always use reservoir temperature, not separator temperature.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and excels. It explains the correlation method used, viscosity behavior patterns (p < pb, p = pb, p > pb), typical value ranges for different oil types, sensitivity to temperature/gas content, and includes important warnings about common mistakes. This provides comprehensive behavioral context beyond basic parameter documentation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Parameters, Viscosity Behavior, Typical Ranges, Returns, Common Mistakes, Example Usage, Note). While comprehensive, some sections could be more concise - the 'Common Mistakes' and 'Example Usage' are quite detailed. However, every sentence adds value for understanding this complex calculation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 7-parameter engineering tool with no annotations and 0% schema description coverage, the description provides exceptional completeness. It covers purpose, methodology, parameter semantics, behavioral patterns, typical outputs, common pitfalls, and includes a detailed example. The existence of an output schema reduces the need to explain return format, but the description still helpfully summarizes it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by providing detailed parameter explanations including physical meaning, valid ranges, examples, and relationships between parameters. It explains how api affects viscosity, temperature effects, pressure behavior, and the critical relationship between p, pb, rs, and rsb that isn't apparent from schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates oil viscosity at reservoir conditions using the Beggs-Robinson correlation. It specifies this is a 'CRITICAL PVT PROPERTY' and distinguishes from siblings like oil_density or oil_compressibility by focusing specifically on viscosity behavior and calculation methodology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context about when this tool is relevant (for reservoir engineering calculations affecting flow rates and recovery) and includes 'Common Mistakes' section that implicitly guides usage. However, it doesn't explicitly state when to use alternatives like gas_viscosity or other oil property tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rachford_rice_flashA

Solve Rachford-Rice equation for vapor-liquid equilibrium.

PHASE BEHAVIOR TOOL - Calculates vapor fraction (beta) and phase compositions for two-phase flash at specified pressure and temperature. Essential for compositional analysis, separator design, and phase behavior calculations.

Parameters:

  • zis (list, required): Overall mole fractions of components (0-1). Must sum to 1.0. Length must match Kis. Example: [0.5, 0.3, 0.2] for 3 components.

  • Kis (list, required): Equilibrium ratios (K-values) for components. Ki = yi/xi where yi = vapor mole fraction, xi = liquid mole fraction. Length must match zis. Example: [2.5, 1.8, 0.6]. K > 1 = light component.

Rachford-Rice Equation: Σ[zi(Ki - 1) / (1 + β(Ki - 1))] = 0

Where:

  • zi = overall mole fraction of component i

  • Ki = equilibrium ratio (yi/xi) for component i

  • β = vapor mole fraction (0 to 1)

Phase Behavior:

  • β = 0: All liquid (subcooled)

  • 0 < β < 1: Two-phase (vapor + liquid)

  • β = 1: All vapor (superheated)

K-Value Behavior:

  • K > 1: Component prefers vapor phase (light components)

  • K = 1: Component equally distributed (critical component)

  • K < 1: Component prefers liquid phase (heavy components)

  • K-values depend on pressure, temperature, and composition

Solution Method: Iterative Newton-Raphson method with bounds checking (0 ≤ β ≤ 1). Converges rapidly for well-posed problems. Typically converges in 3-10 iterations.

Applications:

  • Gas-Oil Separator Design: Determine separator conditions for phase split

  • Phase Envelope: Calculate bubble/dew points and phase boundaries

  • Compositional Simulation: Flash calculations in compositional models

  • EOS Flash: Solve equation of state flash calculations

  • Surface Facility Design: Design separation trains and processing units

  • Material Balance: Phase split in material balance calculations

Returns: Dictionary with:

  • vapor_fraction (float): Vapor mole fraction β (0-1)

  • liquid_composition (list): Liquid phase mole fractions xi

  • vapor_composition (list): Vapor phase mole fractions yi

  • method (str): "Rachford-Rice (Newton-Raphson)"

  • note (str): Interpretation guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Mole fractions don't sum to 1.0 (must normalize)

  • K-values don't match components (length mismatch)

  • K-values at wrong P-T conditions (must match flash conditions)

  • Using weight fractions instead of mole fractions

  • Not accounting for non-hydrocarbon components

  • K-values from wrong correlation/EOS

Example Usage:

{
    "zis": [0.5, 0.3, 0.2],
    "Kis": [2.5, 1.8, 0.6]
}

Result: β ≈ 0.3-0.5 (two-phase), with light components enriched in vapor, heavy components enriched in liquid.

Note: Rachford-Rice equation assumes ideal mixing. For real systems, K-values must account for non-ideality (activity coefficients, fugacity). K-values are typically obtained from EOS (Peng-Robinson, Soave-Redlich-Kwong) or correlations (Wilson, Standing). Always ensure K-values match flash conditions.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits. It explains the solution method (Newton-Raphson with bounds checking), convergence behavior (3-10 iterations), assumptions (ideal mixing), and dependencies (K-values from EOS or correlations). It also details the return structure and includes interpretation guidance for phase behavior (e.g., β=0 means all liquid).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (e.g., Parameters, Rachford-Rice Equation, Applications), but it is lengthy with some redundancy (e.g., repeating parameter details in multiple sections). However, every sentence adds value, such as explaining phase behavior or common mistakes, making it efficient despite its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool (solving an equation with iterative methods), no annotations, and an output schema present, the description is highly complete. It covers purpose, usage, parameters, equation details, solution method, applications, returns, common mistakes, and example usage, providing all necessary context for an AI agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must compensate. It provides detailed semantics for both parameters: zis as 'Overall mole fractions of components (0-1)' with examples and constraints, and Kis as 'Equilibrium ratios (K-values) for components' with definitions and behavior explanations (e.g., K>1 for light components). This adds significant value beyond the minimal schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Solve Rachford-Rice equation for vapor-liquid equilibrium.' It specifies the verb ('solve') and resource ('Rachford-Rice equation'), and distinguishes it from siblings by focusing on flash calculations for compositional analysis, unlike tools for gas properties or oil rates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: 'Essential for compositional analysis, separator design, and phase behavior calculations.' It lists specific applications (e.g., gas-oil separator design, phase envelope calculations) and includes a 'Common Mistakes' section with warnings about when not to use it (e.g., mole fractions not summing to 1.0, K-values at wrong conditions).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stock_tank_gas_sgA

Calculate stock tank gas specific gravity.

Computes the specific gravity of gas liberated at stock tank conditions. This is the gas that comes out of solution when oil reaches atmospheric pressure and temperature.

Stock tank gas properties are needed for:

  • Sales gas quality specifications

  • Flare gas calculations

  • VOC emissions estimation

  • Safety assessments

Returns dimensionless specific gravity (air = 1.0).

Args: request: Stock tank gas parameters including oil properties and separator conditions

Returns: Dictionary with stock tank gas SG value(s), units, and inputs

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It successfully explains what the tool computes (specific gravity of gas liberated at stock tank conditions), describes the return format (dictionary with values, units, and inputs), and clarifies the dimensionless nature of the output (air = 1.0). It doesn't mention error conditions, performance characteristics, or validation requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is perfectly structured and front-loaded: purpose first, then context, applications, return format, and parameter/return sections. Every sentence earns its place with no redundancy or wasted words. The bulleted list of applications is appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the calculation (5 nested parameters, no schema descriptions) and the existence of an output schema, the description does an adequate job explaining what the tool does and why. However, the complete lack of parameter documentation in both schema and description creates a significant gap for a tool with this level of technical complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for undocumented parameters. While it mentions that the 'request' parameter includes 'oil properties and separator conditions,' this is too vague given the 5 nested parameters (api, degf, sg_g, p, psep) that remain unexplained. The description doesn't provide meaningful guidance on what these parameters represent or how they interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Calculate') and resource ('stock tank gas specific gravity'), and distinguishes it from siblings by focusing on gas liberated at stock tank conditions. It explicitly differentiates from 'evolved_gas_sg' by specifying the context of atmospheric pressure and temperature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool by listing specific applications (sales gas quality, flare gas calculations, VOC emissions, safety assessments). However, it doesn't explicitly state when not to use it or name alternatives among the many sibling tools, particularly 'evolved_gas_sg' which appears closely related.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stock_tank_incremental_gorA

Calculate incremental GOR from separator to stock tank.

SEPARATOR DESIGN TOOL - Estimates gas evolved between separator and stock tank conditions.

Physics: As oil flows from separator (higher P, T) to stock tank (14.7 psia, ~60°F), additional gas comes out of solution.

Applications:

  • Separator optimization

  • Gas recovery calculations

  • Tank venting requirements

  • VOC emissions estimation

Returns stock tank incremental GOR in scf/stb.

Args: request: Separator pressure, temperature, and oil API

Returns: Dictionary with incremental GOR and guidance

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the physics behind the calculation and mentions the return format (dictionary with incremental GOR and guidance), but doesn't specify computational characteristics like performance expectations, error conditions, or validation requirements for the input parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, physics, applications, args, returns) and efficiently conveys necessary information. While comprehensive, every sentence serves a purpose - no redundant or wasted text. The formatting with bold headers enhances readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's specialized engineering purpose, no annotations, and the presence of an output schema, the description provides good context. It explains the physics, applications, and what the tool returns. However, for a calculation tool with specific physical constraints, additional guidance on parameter validation or typical use cases would enhance completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (the schema has no descriptions for individual parameters), but the description provides a high-level overview: 'Separator pressure, temperature, and oil API' in the Args section. However, it doesn't explain the meaning or significance of these parameters beyond their names, nor does it provide guidance on valid ranges beyond what's in the schema constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific purpose: 'Calculate incremental GOR from separator to stock tank' with the physics explanation of gas evolution between conditions. It distinguishes itself from sibling tools like 'oil_solution_gor' by focusing specifically on the incremental gas between separator and stock tank rather than total solution gas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool through the 'Applications' section (separator optimization, gas recovery calculations, tank venting requirements, VOC emissions estimation). However, it doesn't explicitly state when NOT to use it or name specific alternatives among the sibling tools for related calculations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_gas_gravitiesA

Validate and impute missing gas gravities.

DATA VALIDATION TOOL - Checks consistency of gas gravities and calculates missing values when one is unknown.

Logic:

  • If sg_g provided: Calculate sg_sp from sg_g

  • If sg_sp provided: Calculate sg_g from sg_sp

  • If both provided: Validate consistency

Use Cases:

  • QC PVT data before analysis

  • Fill gaps in incomplete data

  • Validate separator gas measurements

Returns tuple of (sg_g, sg_sp) with calculated/validated values.

Args: request: Available gas gravities and GORs

Returns: Dictionary with validated/calculated gas gravities

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the logic (calculations based on inputs) and return format (tuple/dictionary), which is helpful. However, it lacks details on error handling, performance, or side effects (e.g., data mutation), leaving gaps for a tool that performs validation and imputation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (DATA VALIDATION TOOL, Logic, Use Cases, Returns) and front-loaded key information. Every sentence earns its place by clarifying purpose, logic, usage, or output without redundancy, making it efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (validation and imputation logic), no annotations, and an output schema (implied by 'Returns'), the description does a good job covering purpose, logic, and use cases. However, it could be more complete by addressing potential errors or assumptions in calculations, slightly reducing its adequacy for full contextual understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must compensate. It adds value by explaining the 'request' parameter contains 'available gas gravities and GORs' and outlines the logic for handling sg_g and sg_sp, providing context beyond the bare schema. However, it does not detail all parameters (e.g., rst, rsp, sg_st), slightly limiting completeness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verbs ('validate', 'impute', 'calculate') and resources ('gas gravities', 'missing values'), distinguishing it from siblings like 'gas_sg_from_composition' or 'weighted_average_gas_sg'. It explicitly defines what the tool does: checking consistency and calculating missing values based on provided inputs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool through listed 'Use Cases' (e.g., QC PVT data, fill gaps, validate measurements), which helps guide appropriate usage. However, it does not explicitly state when not to use it or name specific alternatives among siblings, keeping it from a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_simulation_deckA

Validate and process ECLIPSE simulation deck with INCLUDE files.

DECK MANAGEMENT TOOL - Recursively process ECLIPSE/Intersect simulation decks to find all INCLUDE files, validate references, and optionally create a complete archive.

What It Does:

  • Parses main DATA file for INCLUDE keywords

  • Recursively follows INCLUDE chains

  • Validates all referenced files exist

  • Identifies missing or broken references

  • Optionally creates zip archive with all files

Applications:

  • Deck Validation: Ensure all files present before submission

  • Deck Transfer: Create complete archive for sharing

  • Version Control: Bundle all files for archiving

  • QC Check: Verify deck completeness before cluster runs

Workflow:

  1. Specify main DATA file(s) to check

  2. Tool recursively finds all INCLUDE files

  3. Validates each file exists

  4. Reports missing files or broken paths

  5. Optionally creates zip with all referenced files

INCLUDE File Support:

  • Absolute paths: /full/path/to/file.inc

  • Relative paths: ../INCLUDE/GRID.GRDECL

  • Same directory: SCHEDULE.INC

  • Nested INCLUDE chains: INCLUDE files that reference other INCLUDE files

Output Formats:

  • Summary of all files found

  • List of missing/broken references

  • Optional: ZIP archive with complete deck

Args: request: List of DATA files, zip option, console output preference

Returns: Dictionary with file inventory, validation results, and optional zip path

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure and does so effectively. It describes the recursive processing behavior, validation of file existence, identification of missing references, optional archiving functionality, and support for various path types (absolute, relative, same directory, nested chains). It also specifies output formats. The only minor gap is lack of explicit mention about whether this is a read-only operation or has side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (What It Does, Applications, Workflow, INCLUDE File Support, Output Formats, Args, Returns) that make it easy to scan. Every sentence adds value, with no redundant information. The bold headers provide excellent visual organization while maintaining efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (recursive file processing, validation, optional archiving) and the presence of an output schema (which handles return values), the description provides complete context. It covers purpose, usage scenarios, workflow, file path support, output formats, and parameter semantics. With no annotations, it successfully conveys the tool's behavior and capabilities.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. The 'Args' section provides high-level parameter semantics: 'List of DATA files, zip option, console output preference'. The workflow section further clarifies that files2scrape are 'main DATA file(s) to check'. While it doesn't detail every property of the nested ZipSimDeckRequest object, it gives sufficient context for an agent to understand what parameters are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verbs ('validate and process', 'recursively process', 'find all INCLUDE files', 'validate references', 'create archive') and resources ('ECLIPSE simulation deck', 'INCLUDE files'). It explicitly distinguishes this deck management tool from all sibling tools, which are exclusively fluid property calculators with no overlap in functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Applications' section provides explicit guidance on when to use this tool: for deck validation before submission, deck transfer for sharing, version control archiving, and QC checks before cluster runs. It also implicitly suggests when not to use it (for fluid property calculations like all sibling tools). The workflow section further clarifies the typical usage sequence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

weighted_average_gas_sgA

Calculate weighted average gas specific gravity from separator stages.

SURFACE FACILITIES CALCULATION - Combines gas gravities from separator and stock tank weighted by GORs.

Use Cases:

  • Multi-stage separation optimization

  • Surface facility design

  • Gas sales allocation

  • Material balance

Formula: sg_avg = (sg_sp * rsp + sg_st * rst) / (rsp + rst)

Returns weighted average gas SG (dimensionless, air=1).

Args: request: Separator and stock tank gas properties

Returns: Dictionary with weighted average SG and breakdown

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses the calculation formula and return format (dictionary with weighted average SG and breakdown), which is helpful. However, it doesn't mention error handling, numerical precision, or validation of input ranges beyond what the schema's exclusiveMinimum/minimum hints at.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections (purpose, use cases, formula, args, returns). Every sentence earns its place, though the 'Args' and 'Returns' sections slightly duplicate information that could be inferred from the formula and context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a calculation tool with no annotations but an output schema, the description is quite complete. It explains the purpose, use cases, mathematical formula, parameter roles, and return structure. The main gap is lack of explicit error/edge-case handling, but the formula and parameter constraints provide reasonable coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate. It provides the exact formula showing how all four parameters (sg_sp, rsp, sg_st, rst) interact, defines units (scf/stb), and explains the weighted averaging logic. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Calculate weighted average gas specific gravity'), identifies the resource ('from separator stages'), and distinguishes from siblings by focusing on a multi-stage separation calculation. Unlike tools like 'gas_sg_from_composition' or 'stock_tank_gas_sg', this explicitly handles weighted averaging across stages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use Cases' section provides clear context for when to use this tool (multi-stage separation optimization, surface facility design, gas sales allocation, material balance). However, it doesn't explicitly state when NOT to use it or name specific alternatives among the sibling tools for simpler single-stage calculations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 45 tool updatesv1.0.0
    • Changedbeta_to_lorenz1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "LorenzRequest": {
        +    "description": "Request model for Lorenz coefficient calculation.",
        +    "properties": {
        +      "value": {
        +        "description": "Lorenz or beta value",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "value"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedcalculate_brine_properties1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "BrinePropertiesRequest": {
        +    "description": "Request model for brine properties calculation.",
        +    "example": {
        +      "ch4": 0,
        +      "co2": 0.02,
        +      "degf": 150,
        +      "p": 3000,
        +      "wt": 10
        +    },
        +    "properties": {
        +      "ch4": {
        +        "default": 0,
        +        "description": "Dissolved CH4 mole fraction (dimensionless)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "co2": {
        +        "default": 0,
        +        "description": "Dissolved CO2 mole fraction (dimensionless)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Temperature (degrees Fahrenheit) - scalar or array"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "wt": {
        +        "description": "Brine salinity (weight percent NaCl)",
        +        "maximum": 30,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "p",
        +      "degf",
        +      "wt"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedco2_brine_mutual_solubility1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "CO2BrineMixtureRequest": {
        +    "description": "Request model for CO2-brine mutual solubility calculation.",
        +    "example": {
        +      "cw_sat": 0,
        +      "metric": false,
        +      "ppm": 50000,
        +      "pres": 3000,
        +      "temp": 150
        +    },
        +    "properties": {
        +      "cw_sat": {
        +        "default": 0,
        +        "description": "Cw at saturation pressure (1/psi or 1/bar) - 0 for auto-calculate",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "metric": {
        +        "default": false,
        +        "description": "Use metric units (True) or field units (False)",
        +        "type": "boolean"
        +      },
        +      "ppm": {
        +        "description": "Brine salinity (ppm)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "pres": {
        +        "description": "Pressure (psia if metric=False, bar if metric=True)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "temp": {
        +        "description": "Temperature (degF if metric=False, degC if metric=True)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "pres",
        +      "temp",
        +      "ppm"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedevolved_gas_sg1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "EvolvedGasSGRequest": {
        +    "description": "Request model for evolved gas specific gravity calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "psep": {
        +        "default": 100,
        +        "description": "Separator pressure (psia)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "description": "Separator gas specific gravity",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "api",
        +      "degf",
        +      "sg_g",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedextract_eclipse_problem_cells1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "ExtractProblemCellsRequest": {
        +    "description": "Request model for ECLIPSE problem cell extraction.",
        +    "properties": {
        +      "filename": {
        +        "description": "Path to ECLIPSE/Intersect PRT file",
        +        "type": "string"
        +      },
        +      "silent": {
        +        "default": true,
        +        "description": "Suppress console output",
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "filename"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedflow_fractions_from_lorenz1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "LorenzRequest": {
        +    "description": "Request model for Lorenz coefficient calculation.",
        +    "properties": {
        +      "value": {
        +        "description": "Lorenz or beta value",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "value"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_compressibility1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasCompressibilityRequest": {
        +    "description": "Request model for gas compressibility calculation.",
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      },
        +      "zmethod": {
        +        "default": "DAK",
        +        "description": "Z-factor calculation method",
        +        "enum": [
        +          "DAK",
        +          "HY",
        +          "WYW",
        +          "BUR"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "sg",
        +      "degf",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_critical_properties1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "CriticalPropertiesRequest": {
        +    "description": "Request model for critical properties calculation.",
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "method": {
        +        "default": "PMC",
        +        "description": "Calculation method (PMC recommended)",
        +        "enum": [
        +          "PMC",
        +          "SUT",
        +          "BUR"
        +        ],
        +        "type": "string"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "sg"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_density1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasDensityRequest": {
        +    "description": "Request model for gas density calculation.",
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      },
        +      "zmethod": {
        +        "default": "DAK",
        +        "description": "Z-factor calculation method",
        +        "enum": [
        +          "DAK",
        +          "HY",
        +          "WYW",
        +          "BUR"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "sg",
        +      "degf",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_formation_volume_factor1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasFVFRequest": {
        +    "description": "Request model for gas formation volume factor calculation.",
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      },
        +      "zmethod": {
        +        "default": "DAK",
        +        "description": "Z-factor calculation method",
        +        "enum": [
        +          "DAK",
        +          "HY",
        +          "WYW",
        +          "BUR"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "sg",
        +      "degf",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_pressure_from_pz1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasPressureFromPZRequest": {
        +    "description": "Request model for pressure from P/Z calculation.",
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "pz": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "P/Z value (psia) - scalar or array"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      },
        +      "zmethod": {
        +        "default": "DAK",
        +        "description": "Z-factor calculation method",
        +        "enum": [
        +          "DAK",
        +          "HY",
        +          "WYW",
        +          "BUR"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "pz",
        +      "sg",
        +      "degf"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_pseudopressure1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasPseudopressureRequest": {
        +    "description": "Request model for gas pseudopressure calculation.",
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "p1": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Initial pressure (psia) - scalar or array"
        +      },
        +      "p2": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Final pressure (psia) - scalar or array"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      },
        +      "zmethod": {
        +        "default": "DAK",
        +        "description": "Z-factor calculation method",
        +        "enum": [
        +          "DAK",
        +          "HY",
        +          "WYW",
        +          "BUR"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "sg",
        +      "degf",
        +      "p1",
        +      "p2"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_rate_linear1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasRateLinearRequest": {
        +    "description": "Request model for linear gas inflow performance calculation.",
        +    "properties": {
        +      "area": {
        +        "description": "Drainage area (sq ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h": {
        +        "description": "Net pay thickness (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "k": {
        +        "description": "Permeability (mD)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "length": {
        +        "description": "Well length (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "pi": {
        +        "description": "Initial reservoir pressure (psia)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "psd": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Sandface pressure (psia) - scalar or array"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "pi",
        +      "sg",
        +      "degf",
        +      "psd",
        +      "h",
        +      "k",
        +      "area",
        +      "length"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_rate_radial1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasRateRadialRequest": {
        +    "description": "Request model for radial gas inflow performance calculation.",
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h": {
        +        "description": "Net pay thickness (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "k": {
        +        "description": "Permeability (mD)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "pi": {
        +        "description": "Initial reservoir pressure (psia)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "psd": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Sandface pressure (psia) - scalar or array"
        +      },
        +      "re": {
        +        "description": "Drainage radius (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "rw": {
        +        "description": "Wellbore radius (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "s": {
        +        "default": 0,
        +        "description": "Skin factor (dimensionless)",
        +        "type": "number"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "pi",
        +      "sg",
        +      "degf",
        +      "psd",
        +      "h",
        +      "k",
        +      "re",
        +      "rw"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_sg_from_composition1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasSGFromCompositionRequest": {
        +    "description": "Request model for gas SG from composition calculation.",
        +    "example": {
        +      "co2": 0.05,
        +      "h2": 0,
        +      "h2s": 0.01,
        +      "hc_mw": 20.5,
        +      "n2": 0.02
        +    },
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "h2": {
        +        "default": 0,
        +        "description": "H2 mole fraction",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "hc_mw": {
        +        "description": "Hydrocarbon molecular weight (lb/lbmol)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "hc_mw"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_sg_from_gradient1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasSGFromGradientRequest": {
        +    "description": "Request model for gas SG from pressure gradient.",
        +    "properties": {
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "grad": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure gradient (psi/ft) - scalar or array"
        +      },
        +      "p": {
        +        "description": "Pressure (psia)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "grad",
        +      "degf",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_viscosity1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasViscosityRequest": {
        +    "description": "Request model for gas viscosity calculation.",
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      },
        +      "zmethod": {
        +        "default": "DAK",
        +        "description": "Z-factor calculation method",
        +        "enum": [
        +          "DAK",
        +          "HY",
        +          "WYW",
        +          "BUR"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "sg",
        +      "degf",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_water_content1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "GasWaterContentRequest": {
        +    "description": "Request model for gas water content calculation.",
        +    "example": {
        +      "degf": 100,
        +      "p": 1000
        +    },
        +    "properties": {
        +      "degf": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Temperature (degrees Fahrenheit) - scalar or array"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      }
        +    },
        +    "required": [
        +      "p",
        +      "degf"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgas_z_factor1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "ZFactorRequest": {
        +    "description": "Request model for gas Z-factor calculation.",
        +    "properties": {
        +      "co2": {
        +        "default": 0,
        +        "description": "CO2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h2s": {
        +        "default": 0,
        +        "description": "H2S mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "method": {
        +        "default": "DAK",
        +        "description": "Calculation method (DAK recommended)",
        +        "enum": [
        +          "DAK",
        +          "HY",
        +          "WYW",
        +          "BUR"
        +        ],
        +        "type": "string"
        +      },
        +      "n2": {
        +        "default": 0,
        +        "description": "N2 mole fraction (dimensionless)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "sg": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 2,
        +        "minimum": 0.5,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "sg",
        +      "degf",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgenerate_aquifer_influence1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "InfluenceTableRequest": {
        +    "description": "Request model for Van Everdingen & Hurst aquifer influence tables.",
        +    "example": {
        +      "aqunum": 1,
        +      "ei": true,
        +      "end": 1000,
        +      "infl": "pot",
        +      "res": 10,
        +      "rows": 25,
        +      "start": 0.01
        +    },
        +    "properties": {
        +      "aqunum": {
        +        "default": 1,
        +        "description": "Aquifer number for ECLIPSE",
        +        "maximum": 10,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "ei": {
        +        "default": true,
        +        "description": "Use exponential integral",
        +        "type": "boolean"
        +      },
        +      "end": {
        +        "default": 1000,
        +        "description": "Ending dimensionless time",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "infl": {
        +        "default": "pot",
        +        "description": "Influence function type (pot or press)",
        +        "enum": [
        +          "pot",
        +          "press"
        +        ],
        +        "type": "string"
        +      },
        +      "piston": {
        +        "default": false,
        +        "description": "Piston-like aquifer",
        +        "type": "boolean"
        +      },
        +      "res": {
        +        "default": 10,
        +        "description": "Resolution for integration",
        +        "exclusiveMinimum": 1,
        +        "maximum": 50,
        +        "type": "integer"
        +      },
        +      "rows": {
        +        "default": 25,
        +        "description": "Number of table rows",
        +        "exclusiveMinimum": 0,
        +        "maximum": 200,
        +        "type": "integer"
        +      },
        +      "start": {
        +        "default": 0.01,
        +        "description": "Starting dimensionless time",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "td_scale": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Time dimension scaling"
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
    • Changedgenerate_black_oil_table1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "BlackOilTableRequest": {
        +    "description": "Request model for black oil table generation.",
        +    "example": {
        +      "api": 38,
        +      "degf": 175,
        +      "nrows": 50,
        +      "pb": 3900,
        +      "pi": 4000,
        +      "pmax": 5000,
        +      "rsb": 2300,
        +      "sg_g": 0.68
        +    },
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "bo_method": {
        +        "default": "MCAIN",
        +        "description": "Oil FVF method",
        +        "enum": [
        +          "MCAIN",
        +          "STAN"
        +        ],
        +        "type": "string"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "export": {
        +        "default": false,
        +        "description": "Export ECLIPSE-compatible files",
        +        "type": "boolean"
        +      },
        +      "nrows": {
        +        "default": 50,
        +        "description": "Number of table rows",
        +        "exclusiveMinimum": 0,
        +        "maximum": 200,
        +        "type": "integer"
        +      },
        +      "pb": {
        +        "default": 0,
        +        "description": "Bubble point pressure (psia, 0=calculate)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "pb_method": {
        +        "default": "VALMC",
        +        "description": "Bubble point calculation method",
        +        "enum": [
        +          "STAN",
        +          "VALMC",
        +          "VELAR"
        +        ],
        +        "type": "string"
        +      },
        +      "pi": {
        +        "description": "Initial reservoir pressure (psia)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "pmax": {
        +        "default": 0,
        +        "description": "Maximum pressure for table (psia, 0=auto)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "rs_method": {
        +        "default": "VELAR",
        +        "description": "Solution GOR method",
        +        "enum": [
        +          "VELAR",
        +          "STAN",
        +          "VALMC"
        +        ],
        +        "type": "string"
        +      },
        +      "rsb": {
        +        "default": 0,
        +        "description": "Solution GOR at bubble point (scf/stb, 0=calculate)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "uo_method": {
        +        "const": "BR",
        +        "default": "BR",
        +        "description": "Oil viscosity method",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "pi",
        +      "api",
        +      "degf",
        +      "sg_g"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgenerate_layer_distribution1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "LayerDistributionRequest": {
        +    "description": "Request model for layer distribution generation.",
        +    "example": {
        +      "lorenz": 0.7,
        +      "nlay": 10,
        +      "normalize": true
        +    },
        +    "properties": {
        +      "h": {
        +        "default": 1,
        +        "description": "Total thickness (ft, default=1 for normalized)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "k_avg": {
        +        "default": 1,
        +        "description": "Average permeability (mD, default=1 for normalized)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "lorenz": {
        +        "description": "Lorenz coefficient (0=homogeneous, 1=heterogeneous)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "nlay": {
        +        "description": "Number of layers",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "integer"
        +      },
        +      "normalize": {
        +        "default": true,
        +        "description": "Normalize output (h and k fractions vs absolute)",
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "lorenz",
        +      "nlay"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedgenerate_rel_perm_table1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "RelPermTableRequest": {
        +    "description": "Request model for relative permeability table generation.",
        +    "example": {
        +      "Eo": 1.25,
        +      "Ew": 1.5,
        +      "Lo": 2.5,
        +      "Lw": 2,
        +      "To": 1.75,
        +      "Tw": 2,
        +      "krfamily": "LET",
        +      "kromax": 1,
        +      "krtable": "SWOF",
        +      "krwmax": 0.25,
        +      "rows": 25,
        +      "sorw": 0.15,
        +      "swc": 0.15
        +    },
        +    "properties": {
        +      "Eg": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gas E parameter (LET)"
        +      },
        +      "Eo": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Oil E parameter (LET)"
        +      },
        +      "Ew": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Water E parameter (LET)"
        +      },
        +      "Lg": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gas L parameter (LET)"
        +      },
        +      "Lo": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Oil L parameter (LET)"
        +      },
        +      "Lw": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Water L parameter (LET)"
        +      },
        +      "Tg": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gas T parameter (LET)"
        +      },
        +      "To": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Oil T parameter (LET)"
        +      },
        +      "Tw": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Water T parameter (LET)"
        +      },
        +      "krfamily": {
        +        "default": "LET",
        +        "description": "Correlation family (Corey or LET)",
        +        "enum": [
        +          "COR",
        +          "LET"
        +        ],
        +        "type": "string"
        +      },
        +      "krgmax": {
        +        "anyOf": [
        +          {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Max gas rel perm (SGOF/SGWFN)"
        +      },
        +      "kromax": {
        +        "default": 1,
        +        "description": "Max oil rel perm",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "krtable": {
        +        "default": "SWOF",
        +        "description": "Table type (SWOF, SGOF, SGWFN)",
        +        "enum": [
        +          "SWOF",
        +          "SGOF",
        +          "SGWFN"
        +        ],
        +        "type": "string"
        +      },
        +      "krwmax": {
        +        "anyOf": [
        +          {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Max water rel perm (SWOF)"
        +      },
        +      "ng": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gas Corey exponent"
        +      },
        +      "no": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Oil Corey exponent"
        +      },
        +      "nw": {
        +        "anyOf": [
        +          {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Water Corey exponent"
        +      },
        +      "rows": {
        +        "default": 25,
        +        "description": "Number of table rows",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "integer"
        +      },
        +      "sgc": {
        +        "anyOf": [
        +          {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Critical gas saturation"
        +      },
        +      "sorg": {
        +        "anyOf": [
        +          {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Residual oil to gas"
        +      },
        +      "sorw": {
        +        "anyOf": [
        +          {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Residual oil to water"
        +      },
        +      "swc": {
        +        "default": 0,
        +        "description": "Connate water saturation",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "swcr": {
        +        "anyOf": [
        +          {
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Critical water sat (Corey)"
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
    • Changedget_component_properties1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "ComponentPropertiesRequest": {
        +    "description": "Request model for component critical properties lookup.",
        +    "properties": {
        +      "component": {
        +        "description": "Component name (e.g., 'Methane', 'C1', 'Ethane', 'C2')",
        +        "type": "string"
        +      },
        +      "eos": {
        +        "default": "PR79",
        +        "description": "Equation of State model",
        +        "enum": [
        +          "PR79",
        +          "PR77",
        +          "SRK",
        +          "RK"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "component"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedlorenz_from_flow_fractions1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "FlowFractionRequest": {
        +    "description": "Request model for flow fraction calculations.",
        +    "example": {
        +      "flow_frac": [
        +        0.8,
        +        0.15,
        +        0.05
        +      ],
        +      "perm_frac": [
        +        0.6,
        +        0.3,
        +        0.1
        +      ]
        +    },
        +    "properties": {
        +      "flow_frac": {
        +        "description": "Flow fractions per layer",
        +        "items": {
        +          "type": "number"
        +        },
        +        "minItems": 2,
        +        "type": "array"
        +      },
        +      "perm_frac": {
        +        "description": "Permeability-thickness fractions per layer",
        +        "items": {
        +          "type": "number"
        +        },
        +        "minItems": 2,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "flow_frac",
        +      "perm_frac"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedlorenz_to_beta1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "LorenzRequest": {
        +    "description": "Request model for Lorenz coefficient calculation.",
        +    "properties": {
        +      "value": {
        +        "description": "Lorenz or beta value",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "value"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_api_from_sg1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "SGConversionRequest": {
        +    "description": "Request model for SG to API conversion.",
        +    "properties": {
        +      "sg": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Specific gravity - scalar or array"
        +      }
        +    },
        +    "required": [
        +      "sg"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_bubble_point1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "BubblePointRequest": {
        +    "description": "Request model for bubble point pressure calculation.",
        +    "example": {
        +      "api": 35,
        +      "degf": 180,
        +      "method": "VALMC",
        +      "rsb": 800,
        +      "sg_g": 0.75
        +    },
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "method": {
        +        "default": "VALMC",
        +        "description": "Calculation method (VALMC recommended)",
        +        "enum": [
        +          "STAN",
        +          "VALMC",
        +          "VELAR"
        +        ],
        +        "type": "string"
        +      },
        +      "rsb": {
        +        "description": "Solution GOR at bubble point (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "default": 0,
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "api",
        +      "degf",
        +      "rsb"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_compressibility1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "OilCompressibilityRequest": {
        +    "description": "Request model for oil compressibility calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "pb": {
        +        "description": "Bubble point pressure (psia)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "rs": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Solution GOR (scf/stb) - scalar or array"
        +      },
        +      "rsb": {
        +        "default": 0,
        +        "description": "Solution GOR at bubble point (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "p",
        +      "api",
        +      "degf",
        +      "pb",
        +      "sg_g",
        +      "rs"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_density1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "OilDensityRequest": {
        +    "description": "Request model for oil density calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "bo": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Oil FVF (rb/stb) - scalar or array"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "rs": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Solution GOR (scf/stb) - scalar or array"
        +      },
        +      "sg_g": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "p",
        +      "api",
        +      "degf",
        +      "rs",
        +      "sg_g",
        +      "bo"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_formation_volume_factor1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "OilFVFRequest": {
        +    "description": "Request model for oil formation volume factor calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "method": {
        +        "default": "MCAIN",
        +        "description": "Calculation method (MCAIN recommended)",
        +        "enum": [
        +          "MCAIN",
        +          "STAN"
        +        ],
        +        "type": "string"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "pb": {
        +        "default": 0,
        +        "description": "Bubble point pressure (psia)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "rs": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "default": 0,
        +        "description": "Solution GOR (scf/stb) - scalar or array"
        +      },
        +      "rsb": {
        +        "default": 0,
        +        "description": "Solution GOR at bubble point (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "default": 0,
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "api",
        +      "degf",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_rate_linear1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "OilRateLinearRequest": {
        +    "description": "Request model for linear oil inflow performance calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "area": {
        +        "description": "Drainage area (sq ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h": {
        +        "description": "Net pay thickness (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "k": {
        +        "description": "Permeability (mD)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "length": {
        +        "description": "Well length (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "pb": {
        +        "description": "Bubble point pressure (psia)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "pi": {
        +        "description": "Initial reservoir pressure (psia)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "psd": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Sandface pressure (psia) - scalar or array"
        +      },
        +      "rsb": {
        +        "default": 0,
        +        "description": "Solution GOR at bubble point (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "pi",
        +      "pb",
        +      "api",
        +      "degf",
        +      "sg_g",
        +      "psd",
        +      "h",
        +      "k",
        +      "area",
        +      "length"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_rate_radial1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "OilRateRadialRequest": {
        +    "description": "Request model for radial oil inflow performance calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "h": {
        +        "description": "Net pay thickness (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "k": {
        +        "description": "Permeability (mD)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "pb": {
        +        "description": "Bubble point pressure (psia)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "pi": {
        +        "description": "Initial reservoir pressure (psia)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "psd": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Sandface pressure (psia) - scalar or array"
        +      },
        +      "re": {
        +        "description": "Drainage radius (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "rsb": {
        +        "default": 0,
        +        "description": "Solution GOR at bubble point (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "rw": {
        +        "description": "Wellbore radius (ft)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "s": {
        +        "default": 0,
        +        "description": "Skin factor (dimensionless)",
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "vogel": {
        +        "default": false,
        +        "description": "Use Vogel IPR for reservoir pressure below bubble point",
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "pi",
        +      "pb",
        +      "api",
        +      "degf",
        +      "sg_g",
        +      "psd",
        +      "h",
        +      "k",
        +      "re",
        +      "rw"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_rs_at_bubble_point1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "BubblePointRequest": {
        +    "description": "Request model for bubble point pressure calculation.",
        +    "example": {
        +      "api": 35,
        +      "degf": 180,
        +      "method": "VALMC",
        +      "rsb": 800,
        +      "sg_g": 0.75
        +    },
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "method": {
        +        "default": "VALMC",
        +        "description": "Calculation method (VALMC recommended)",
        +        "enum": [
        +          "STAN",
        +          "VALMC",
        +          "VELAR"
        +        ],
        +        "type": "string"
        +      },
        +      "rsb": {
        +        "description": "Solution GOR at bubble point (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "default": 0,
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "api",
        +      "degf",
        +      "rsb"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_sg_from_api1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "APIConversionRequest": {
        +    "description": "Request model for API to SG conversion.",
        +    "properties": {
        +      "api": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "API gravity (degrees) - scalar or array"
        +      }
        +    },
        +    "required": [
        +      "api"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_sg_from_jacoby1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "JacobyAromaticitySGRequest": {
        +    "description": "Request model for Jacoby aromaticity to SG calculation.",
        +    "properties": {
        +      "ja": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Jacoby aromaticity factor (0=paraffinic, 1=aromatic)",
        +        "ge": 0,
        +        "le": 1
        +      },
        +      "mw": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Molecular weight (lb/lbmol) - scalar or array",
        +        "gt": 0
        +      }
        +    },
        +    "required": [
        +      "mw",
        +      "ja"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_solution_gor1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "SolutionGORRequest": {
        +    "description": "Request model for solution gas-oil ratio calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "method": {
        +        "default": "VELAR",
        +        "description": "Calculation method",
        +        "enum": [
        +          "VELAR",
        +          "STAN",
        +          "VALMC"
        +        ],
        +        "type": "string"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "pb": {
        +        "default": 0,
        +        "description": "Bubble point pressure (psia)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "rsb": {
        +        "default": 0,
        +        "description": "Solution GOR at bubble point (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "default": 0,
        +        "description": "Gas specific gravity (air=1, dimensionless)",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "api",
        +      "degf",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_twu_critical_properties1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "TwuPropertiesRequest": {
        +    "description": "Request model for Twu critical properties calculation.",
        +    "properties": {
        +      "damp": {
        +        "default": 0,
        +        "description": "Damping factor (0-1)",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "mw": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Molecular weight (lb/lbmol) - scalar or array",
        +        "gt": 0
        +      },
        +      "sg": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Specific gravity - scalar or array",
        +        "gt": 0
        +      },
        +      "tb": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Boiling point (degR) - optional"
        +      }
        +    },
        +    "required": [
        +      "mw",
        +      "sg"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedoil_viscosity1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "OilViscosityRequest": {
        +    "description": "Request model for oil viscosity calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "method": {
        +        "const": "BR",
        +        "default": "BR",
        +        "description": "Calculation method",
        +        "type": "string"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "pb": {
        +        "default": 0,
        +        "description": "Bubble point pressure (psia)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "rs": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "default": 0,
        +        "description": "Solution GOR (scf/stb) - scalar or array"
        +      },
        +      "rsb": {
        +        "default": 0,
        +        "description": "Solution GOR at bubble point (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "api",
        +      "degf",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedrachford_rice_flash1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "RachfordRiceRequest": {
        +    "description": "Request model for Rachford-Rice flash calculation.",
        +    "example": {
        +      "Kis": [
        +        1.5,
        +        0.9,
        +        0.3
        +      ],
        +      "zis": [
        +        0.5,
        +        0.3,
        +        0.2
        +      ]
        +    },
        +    "properties": {
        +      "Kis": {
        +        "description": "K-values (yi/xi)",
        +        "items": {
        +          "type": "number"
        +        },
        +        "minItems": 2,
        +        "type": "array"
        +      },
        +      "zis": {
        +        "description": "Overall mole fractions",
        +        "items": {
        +          "type": "number"
        +        },
        +        "minItems": 2,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "zis",
        +      "Kis"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedstock_tank_gas_sg1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "EvolvedGasSGRequest": {
        +    "description": "Request model for evolved gas specific gravity calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf": {
        +        "description": "Temperature (degrees Fahrenheit)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "p": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Pressure (psia) - scalar or array"
        +      },
        +      "psep": {
        +        "default": 100,
        +        "description": "Separator pressure (psia)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "description": "Separator gas specific gravity",
        +        "maximum": 3,
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "api",
        +      "degf",
        +      "sg_g",
        +      "p"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedstock_tank_incremental_gor1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "StockTankGORRequest": {
        +    "description": "Request model for stock tank incremental GOR calculation.",
        +    "properties": {
        +      "api": {
        +        "description": "Oil API gravity (degrees)",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      },
        +      "degf_sp": {
        +        "description": "Separator temperature (degF)",
        +        "exclusiveMaximum": 1000,
        +        "exclusiveMinimum": -460,
        +        "type": "number"
        +      },
        +      "psp": {
        +        "description": "Separator pressure (psia)",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "psp",
        +      "degf_sp",
        +      "api"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedvalidate_gas_gravities1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "CheckGasSGsRequest": {
        +    "description": "Request model for gas gravity validation/imputation.",
        +    "properties": {
        +      "rsp": {
        +        "description": "Separator GOR (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "rst": {
        +        "description": "Stock tank GOR (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg_g": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Weighted average gas SG (optional)"
        +      },
        +      "sg_sp": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Separator gas SG (optional)"
        +      },
        +      "sg_st": {
        +        "description": "Stock tank gas SG",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "rst",
        +      "rsp",
        +      "sg_st"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedvalidate_simulation_deck1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "ZipSimDeckRequest": {
        +    "description": "Request model for simulation deck file checking.",
        +    "example": {
        +      "console_summary": true,
        +      "files2scrape": [
        +        "CASE.DATA"
        +      ],
        +      "tozip": false
        +    },
        +    "properties": {
        +      "console_summary": {
        +        "default": true,
        +        "description": "Print summary to console",
        +        "type": "boolean"
        +      },
        +      "files2scrape": {
        +        "description": "List of deck files to process (e.g., ['CASE.DATA'])",
        +        "items": {
        +          "type": "string"
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "tozip": {
        +        "default": false,
        +        "description": "Create zip archive of all referenced files",
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "files2scrape"
        +    ],
        +    "type": "object"
        +  }
        +}
    • Changedweighted_average_gas_sg1 field changed
      • addedInput schema / $defs
        Added value: +{
        +  "WeightedAverageGasSGRequest": {
        +    "description": "Request model for weighted average gas SG calculation.",
        +    "properties": {
        +      "rsp": {
        +        "description": "Separator GOR (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "rst": {
        +        "description": "Stock tank GOR (scf/stb)",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "sg_sp": {
        +        "description": "Separator gas specific gravity",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "sg_st": {
        +        "description": "Stock tank gas specific gravity",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "sg_sp",
        +      "rsp",
        +      "sg_st",
        +      "rst"
        +    ],
        +    "type": "object"
        +  }
        +}
  2. 45 tool updates
    • First observedbeta_to_lorenz
    • First observedcalculate_brine_properties
    • First observedco2_brine_mutual_solubility
    • First observedevolved_gas_sg
    • First observedextract_eclipse_problem_cells
    • First observedflow_fractions_from_lorenz
    • First observedgas_compressibility
    • First observedgas_critical_properties
    • First observedgas_density
    • First observedgas_formation_volume_factor
    • First observedgas_pressure_from_pz
    • First observedgas_pseudopressure
    • First observedgas_rate_linear
    • First observedgas_rate_radial
    • First observedgas_sg_from_composition
    • First observedgas_sg_from_gradient
    • First observedgas_viscosity
    • First observedgas_water_content
    • First observedgas_z_factor
    • First observedgenerate_aquifer_influence
    • First observedgenerate_black_oil_table
    • First observedgenerate_layer_distribution
    • First observedgenerate_rel_perm_table
    • First observedget_component_properties
    • First observedlorenz_from_flow_fractions
    • First observedlorenz_to_beta
    • First observedoil_api_from_sg
    • First observedoil_bubble_point
    • First observedoil_compressibility
    • First observedoil_density
    • First observedoil_formation_volume_factor
    • First observedoil_rate_linear
    • First observedoil_rate_radial
    • First observedoil_rs_at_bubble_point
    • First observedoil_sg_from_api
    • First observedoil_sg_from_jacoby
    • First observedoil_solution_gor
    • First observedoil_twu_critical_properties
    • First observedoil_viscosity
    • First observedrachford_rice_flash
    • First observedstock_tank_gas_sg
    • First observedstock_tank_incremental_gor
    • First observedvalidate_gas_gravities
    • First observedvalidate_simulation_deck
    • First observedweighted_average_gas_sg

TDQS

A4.3/5.0

Scored across 45 tools

Disambiguation4/5

Most tools have distinct purposes within reservoir engineering, but there is some overlap between gas property tools (e.g., gas_z_factor, gas_critical_properties, gas_compressibility) which could cause confusion if an agent doesn't carefully read descriptions. However, each tool targets a specific calculation, and descriptions are detailed enough to differentiate them.

Naming Consistency5/5

Tool names follow a consistent snake_case pattern with clear verb_noun structure (e.g., calculate_brine_properties, gas_formation_volume_factor, oil_bubble_point). There are no deviations in naming conventions, making the set predictable and easy to parse.

Tool Count2/5

With 45 tools, the count is excessive for a single server, even for a comprehensive reservoir engineering toolkit. This many tools can overwhelm agents and increase selection complexity, suggesting the server should be split into more focused sub-servers (e.g., gas PVT, oil PVT, simulation tools).

Completeness5/5

The tool set provides extensive coverage of reservoir engineering domains, including PVT properties for oil, gas, and brine, flow calculations, heterogeneity analysis, simulation support, and phase behavior. There are no obvious gaps; it supports full workflows from data conversion to simulation input generation.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Enables AI assistants to perform complex chemical engineering calculations including thermodynamic modeling, equation of state calculations, phase equilibrium computations, and vapor-liquid equilibrium analysis. Built on the MoziChem framework to bridge AI language models with specialized chemical engineering tools.
    6
    4
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to perform unit-aware engineering calculations with automatic unit conversion, dependency resolution, and access to 500+ units across 75+ categories through the CalcsLive calculation engine.
    3
    4 npm
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Provides AI agents with physics-based corrosion engineering calculations, from rapid handbook lookups to mechanistic electrochemical models with dual-tier pitting assessment for material compatibility screening and corrosion rate prediction.
    1
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    MCP server that gives LLMs access to petroleum engineering data and tools. Parse well logs, query production data, fit decline curves, calculate EUR, and run nodal analysis -- all through natural language with any MCP-compatible AI assistant.
    83
    1
    MIT