pyResToolbox MCP Server
The pyResToolbox MCP Server provides AI assistants like Claude with 47 production-ready reservoir engineering calculation tools for petroleum engineering workflows through natural language interaction.
Core Capabilities:
Oil PVT Analysis (17 tools) - Calculate bubble point pressure, solution GOR, formation volume factor (Bo), viscosity, density, compressibility, and generate comprehensive black oil tables (PVTO, PVDO) for simulators using industry-standard correlations (Standing, Valko-McCain, Velarde, McCain, Beggs-Robinson). Includes API gravity conversions and property estimation from composition.
Gas PVT Analysis (11 tools) - Compute Z-factor (DAK, Hall-Yarborough, WYW, Burrows), critical properties (Tc, Pc) with contaminant support (H2S, CO2, N2, H2), formation volume factor (Bg), viscosity, density, compressibility, pseudopressure, and water content. Includes gas specific gravity conversions, pressure from P/Z calculations, and gravity validation.
Well Performance & IPR (4 tools) - Generate inflow performance relationship curves for oil and gas wells with radial (vertical) and linear (horizontal) flow geometries, incorporating real gas pseudopressure formulations and optionally Vogel IPR for two-phase flow below bubble point. Analyze sensitivity to permeability, skin factor, and reservoir pressure.
Reservoir Simulation Support (5 tools) - Create relative permeability tables (SWOF, SGOF, SGWFN) using Corey and LET correlations, generate Van Everdingen & Hurst aquifer influence functions (AQUTAB), solve Rachford-Rice flash calculations for vapor-liquid equilibrium, extract convergence problem cells from ECLIPSE/Intersect PRT files, and validate simulation decks with INCLUDE files.
Brine & CO2 Sequestration (2 tools) - Calculate properties of CH4 or CO2 saturated brine including density, viscosity, compressibility, and formation volume factor across salinity ranges from fresh to highly saline water. Compute CO2-brine mutual solubilities using Duan & Sun (2003) model for CCS projects and aquifer analysis.
Reservoir Heterogeneity Analysis (5 tools) - Convert between Lorenz coefficient and Dykstra-Parsons beta parameter, calculate Lorenz coefficient from production logging (PLT) data or flow/permeability fractions, generate synthetic flow distributions, and create layered permeability distributions for vertical conformance and sweep efficiency analysis.
Component Library (1 tool) - Access critical properties (MW, Tc, Pc, Zc, ω, Vcritical, Tb, SG) for 100+ hydrocarbon components and non-hydrocarbons, including normal paraffins (C1-C45), aromatics, and naphthenes, with support for multiple EOS models (PR79, PR77, SRK, RK).
Key Features:
100% test coverage with validated calculations
Industry-standard field units (psia, °F, ft, mD, STB/day, MSCF/day)
Array calculations for multiple pressures/conditions simultaneously
ECLIPSE-compatible simulation input files
Zero configuration for Claude Desktop integration
Production-ready with Docker deployment support
GPL-3.0 licensed open source
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pyResToolbox MCP Servercalculate bubble point pressure for 35° API oil at 180°F with 800 scf/stb GOR"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pyResToolbox MCP Server
Bring Reservoir Engineering Calculations to AI
Power your AI assistants with industry-standard petroleum engineering calculations
Quick Start • Features • Examples • Documentation • Contributing
108 Production-Ready Tools | Field & Metric Units | Zero Configuration
PVT Analysis • Well Performance • Nodal Analysis • DCA • Material Balance • Simulation Support • Brine Properties • Geomechanics • Heterogeneity 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.
☕ 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 correctlyConnect 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 SourceConfiguration:
{
"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/uvor/home/username/.local/bin/uvWindows:
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!
Add the AI Skill (Recommended)
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 |
| Ready-to-install skill bundle (zip format) |
| Skill definition with YAML front-matter trigger conditions |
| 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.mdOnce 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 (
psdnotpwf,sgnotsg_gfor gas tools,zmethodvsmethod)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.75What 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
Be Specific - Include all relevant parameters (API, temperature, pressure, etc.)
Specify Methods - Mention which correlation you want (VALMC, DAK, Corey, LET, etc.)
Include Units - Always specify units (psia, degF, mD, ft, etc.)
Ask for Comparisons - Request comparisons between methods or scenarios
Request Tables - Ask for tabulated results when you need multiple values
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 deploymentHow It Works
FastMCP Server - Handles MCP protocol communication (STDIO, HTTP, SSE)
Pydantic Models - Validate all inputs with descriptive error messages
Tool Layer - 108 functions wrapping pyrestoolbox calculations
pyRestToolbox - Performs actual reservoir engineering calculations
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 |
|
Multi-segment deviated/horizontal completions | Full |
|
Production and injection modes | Full |
|
GasPVT and OilPVT wrapper classes | Full | Used internally by nodal tools for consistent fluid characterization |
VFPPROD/VFPINJ table generation | Full |
|
Multi-gas brine (Soreide-Whitson VLE) | Full |
|
IAPWS-IF97 freshwater density | Full | Handled internally by pyRestToolbox brine functions |
Hydrogen-capable gas PVT (BUR/Peng-Robinson) | Full |
|
Metric unit support | Full |
|
Simulation tables (PVDO/PVDG/PVTO/PVTW) | Full |
|
Rel perm fitting (Corey, LET, Jerauld) | Full |
|
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 |
|
Functions Not Exposed as MCP Tools
Some pyResToolbox functions are used internally but not exposed as standalone MCP tools:
Function | Reason |
| Used internally by nodal tools; individual PVT tools cover same calculations |
| Low-level function; |
| Specialized functions covered by |
| Covered by |
| Inverse P/Z lookup; covered by |
| Covered by |
| 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.pySee 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.pyCode 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-downSee DOCKER.md for complete Docker documentation.
Adding New Tools
See CONTRIBUTING.md for detailed instructions. Quick overview:
Define Pydantic Model in
src/pyrestoolbox_mcp/models/Implement Tool Function in appropriate
src/pyrestoolbox_mcp/tools/fileRegister Tool in the module's
register_*_tools()functionAdd Tests to
test_tools.pyand appropriate pytest fileUpdate 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 -dThen 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 --versionAlternative: 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-installCheck Python version:
python --version(needs 3.10+)
Claude Desktop Integration
Error: "spawn uv ENOENT"
This means Claude Desktop cannot find the
uvcommandGUI applications don't inherit your terminal's PATH
Solution: Use absolute path to
uvin your configFind UV path:
which uv(macOS/Linux) orGet-Command uv(Windows)Common locations:
macOS/Linux:
/Users/username/.local/bin/uvor/home/username/.local/bin/uvWindows:
C:\Users\username\.cargo\bin\uv.exe
Claude doesn't see the tools
Use absolute paths for both
uvcommand and project directory (no~, use full path)Verify paths are correct:
ls /path/to/uvandls /path/to/pyrestoolbox-mcpCompletely restart Claude Desktop (Quit, not just close window)
Check Claude Desktop logs:
macOS:
~/Library/Logs/Claude/Windows:
%APPDATA%\Claude\logs\Linux:
~/.config/Claude/logs/
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 --forceCalculation 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
Check INTERESTING_QUERIES.md for query examples
Review examples/ directory for working code
See CONTRIBUTING.md for development setup
Open an issue for bugs or feature requests
Contributing
Contributions are welcome! This project follows the GPL-3.0 license of the upstream pyResToolbox library.
How to Contribute
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Make your changes (follow code style guidelines)
Test thoroughly (
uv run pytest- all tests must pass)Format code (
uv run black src/ tests/)Commit (
git commit -m 'Add amazing feature')Push (
git push origin feature/amazing-feature)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 passGuidelines
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 | 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_grad2sgimplementation (bug fix)Enhanced type hints
Additional validation utilities
Related Projects
Core Dependencies
pyResToolbox - Reservoir engineering library by Mark Burgoyne
FastMCP - Python framework for MCP servers
Model Context Protocol - MCP specification by Anthropic
Similar MCP Servers
mcp-servers - Official MCP server examples
awesome-mcp-servers - Curated list of MCP servers
Petroleum Engineering Tools
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:
Check Troubleshooting section
Review examples/ directory
Search existing issues
Open a new issue
For calculation accuracy or pyResToolbox features:
For FastMCP framework:
For Model Context Protocol:
Join MCP Discord (if available)
Community
Discussions: GitHub Discussions
Issues: GitHub Issues
Pull Requests: Contributing Guide
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
Built with ❤️ for the petroleum engineering community
Created by Gabriel Serrao
Report Bug · Request Feature · Documentation · Examples
Available Tools
45 toolsbeta_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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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:
Run ECLIPSE/Intersect simulation
Locate the .PRT output file
Use this tool to extract problem cell locations
Investigate problematic cells in pre-processor
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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:
Convert Lorenz to beta parameter
Generate log-normal permeability distribution
Sort layers by permeability (ascending)
Assign equal thickness to each layer
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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:
Choose correlation family (Corey or LET)
Select table type (SWOF, SGOF, SGWFN)
Specify saturation endpoints (Swc, Sor, Sgc)
Set maximum rel perms (kromax, krwmax, krgmax)
Define correlation parameters (Corey exponents or LET params)
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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:
Sort layers by kh fraction (ascending)
Calculate cumulative kh fraction (x-axis)
Calculate cumulative flow fraction (y-axis)
Calculate area between curve and diagonal (45° line)
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).
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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:
Specify main DATA file(s) to check
Tool recursively finds all INCLUDE files
Validates each file exists
Reports missing files or broken paths
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
45 tool updates
v1.0.0- Changed
beta_to_lorenz1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
calculate_brine_properties1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
co2_brine_mutual_solubility1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
evolved_gas_sg1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
extract_eclipse_problem_cells1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
flow_fractions_from_lorenz1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_compressibility1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_critical_properties1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_density1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_formation_volume_factor1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_pressure_from_pz1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_pseudopressure1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_rate_linear1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_rate_radial1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_sg_from_composition1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_sg_from_gradient1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_viscosity1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_water_content1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
gas_z_factor1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
generate_aquifer_influence1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
generate_black_oil_table1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
generate_layer_distribution1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
generate_rel_perm_table1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
get_component_properties1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
lorenz_from_flow_fractions1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
lorenz_to_beta1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_api_from_sg1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_bubble_point1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_compressibility1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_density1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_formation_volume_factor1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_rate_linear1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_rate_radial1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_rs_at_bubble_point1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_sg_from_api1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_sg_from_jacoby1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_solution_gor1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_twu_critical_properties1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
oil_viscosity1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
rachford_rice_flash1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
stock_tank_gas_sg1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
stock_tank_incremental_gor1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
validate_gas_gravities1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
validate_simulation_deck1 field changed- added
Input schema / $defsAdded 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" + } +}
- Changed
weighted_average_gas_sg1 field changed- added
Input schema / $defsAdded 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" + } +}
45 tool updates
- First observed
beta_to_lorenz - First observed
calculate_brine_properties - First observed
co2_brine_mutual_solubility - First observed
evolved_gas_sg - First observed
extract_eclipse_problem_cells - First observed
flow_fractions_from_lorenz - First observed
gas_compressibility - First observed
gas_critical_properties - First observed
gas_density - First observed
gas_formation_volume_factor - First observed
gas_pressure_from_pz - First observed
gas_pseudopressure - First observed
gas_rate_linear - First observed
gas_rate_radial - First observed
gas_sg_from_composition - First observed
gas_sg_from_gradient - First observed
gas_viscosity - First observed
gas_water_content - First observed
gas_z_factor - First observed
generate_aquifer_influence - First observed
generate_black_oil_table - First observed
generate_layer_distribution - First observed
generate_rel_perm_table - First observed
get_component_properties - First observed
lorenz_from_flow_fractions - First observed
lorenz_to_beta - First observed
oil_api_from_sg - First observed
oil_bubble_point - First observed
oil_compressibility - First observed
oil_density - First observed
oil_formation_volume_factor - First observed
oil_rate_linear - First observed
oil_rate_radial - First observed
oil_rs_at_bubble_point - First observed
oil_sg_from_api - First observed
oil_sg_from_jacoby - First observed
oil_solution_gor - First observed
oil_twu_critical_properties - First observed
oil_viscosity - First observed
rachford_rice_flash - First observed
stock_tank_gas_sg - First observed
stock_tank_incremental_gor - First observed
validate_gas_gravities - First observed
validate_simulation_deck - First observed
weighted_average_gas_sg
TDQS
Scored across 45 tools
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.
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.
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).
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
Related MCP Connectors
AI-callable calculators and engineering models with real formulas. No hallucinated math.
60+ units, live FX, timezones, and date arithmetic for AI agents.
Precision math engine for AI agents. 203 exact methods. Zero hallucination.
Loan & mortgage calculator, compound interest, ROI, crypto prices, FX conversion for AI agents.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables 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.64MIT
- AlicenseAqualityDmaintenanceEnables 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.34 npmMIT
- AlicenseNot gradedqualityFmaintenanceProvides 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.1MIT
petropt/petro-mcpprivate
AlicenseBqualityBmaintenanceMCP 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.831MIT