Skip to main content
Glama
puran-water

Corrosion Engineering MCP Server

by puran-water

Corrosion Engineering MCP Server

Physics-Based Corrosion Rate Prediction via Model Context Protocol

License: MIT Python 3.12+ MCP Compatible Version 0.3.0 Tests Passing Tools


⚠️ DEVELOPMENT STATUS: This project is under active development and is not yet production-ready. APIs, interfaces, and functionality may change without notice. Use at your own risk for evaluation and testing purposes only. Not recommended for production deployments.

Overview

Corrosion Engineering MCP Server is a FastMCP-based toolkit that provides AI agents with access to physics-based corrosion engineering calculations, ranging from rapid handbook lookups to mechanistic electrochemical models with dual-tier pitting assessment.

Current Status: Version 0.3.0 (2025-12-15)

  • 348 tests passing (100% coverage)

  • 14 MCP tools with corrosion_ prefix

  • All critical bugs fixed

See IMPLEMENTATION_ROADMAP.md for implementation history.


Quick Start

Installation

# Clone repository
git clone git@github.com:puran-water/corrosion-engineering-mcp.git
cd corrosion-engineering-mcp

# Activate virtual environment
source ../venv312/bin/activate  # Linux/Mac
# OR
..\venv312\Scripts\activate     # Windows

# Install dependencies
pip install -r requirements.txt

# Run tests
pytest tests/test_phase3_pitting_integration.py -v

MCP Configuration

Add to Claude Desktop config (.mcp.json):

{
  "mcpServers": {
    "corrosion-engineering": {
      "command": "python",
      "args": ["/path/to/corrosion-engineering-mcp/server.py"]
    }
  }
}

Full configuration guide: MCP_CONFIGURATION.md


Phase 3 Highlights: Dual-Tier Pitting Assessment

What's New

Tier 1 + Tier 2 Pitting Assessment: Combines fast empirical screening (PREN/CPT) with mechanistic electrochemical assessment (E_pit vs E_mix).

Example (SS316 in seawater):

result = calculate_localized_corrosion(
    material="SS316",  # or 316L, 316, UNS S31600 (aliases supported)
    temperature_C=25.0,
    Cl_mg_L=19000.0,
    pH=8.0,
    dissolved_oxygen_mg_L=8.0,  # ← Enables Tier 2
)

# Tier 1 (PREN/CPT - always available)
print(result["pitting"]["susceptibility"])  # "critical" (T > CPT)
print(result["pitting"]["CPT_C"])            # 10.0°C
print(result["pitting"]["PREN"])             # 24.7

# Tier 2 (E_pit vs E_mix - requires DO)
print(result["pitting"]["electrochemical_risk"])  # "low" (E_mix << E_pit)
print(result["pitting"]["E_pit_VSCE"])            # 1.084 V_SCE
print(result["pitting"]["E_mix_VSCE"])            # 0.501 V_SCE

# Tier disagreement detection
print(result["tier_disagreement"]["detected"])    # True
print(result["tier_disagreement"]["explanation"]) # "Trust Tier 2 for accurate assessment..."

Key Insight: CPT test (ferric chloride, saturated) is conservative. Tier 2 provides mechanistic driving force (ΔE = E_mix - E_pit) accounting for actual dissolved oxygen.

Codex UX Improvements ✅

  1. Self-describing Tier 2 unavailability: electrochemical_interpretation explains WHY (not just null)

  2. RedoxState warnings surfaced: DO saturation, anaerobic conditions appended to interpretation

  3. Material alias mapping: 316L, 316, UNS S31600 → SS316 (6 aliases supported)

  4. Tier disagreement detection: Automatic warning when Tier 1 ≠ Tier 2 with guidance

Full user guide: docs/TIER1_VS_TIER2_PITTING_GUIDE.md


Architecture: 4-Tier Framework

Tier 0: Handbook Lookup (~0.5 sec)

Purpose: Rapid screening via semantic search on 2,980 vector chunks

Tools (3):

  • corrosion_screen_materials - Material-environment compatibility

  • corrosion_query_typical_rates - Empirical corrosion rates

  • corrosion_identify_mechanism - Mechanism identification + mitigation


Tier 1: Chemistry (~1 sec)

Purpose: Aqueous speciation and scaling indices

Tools (2):

  • corrosion_langelier_index - Water scaling tendency (Langelier SI)

  • corrosion_predict_scaling - Mineral scale prediction


Tier 2: Mechanistic Physics (1-5 sec)

Purpose: First-principles electrochemical models

Tools (7):

  • corrosion_predict_co2_h2s - NORSOK M-506 sweet/sour service

  • corrosion_predict_aerated_chloride - O₂ mass transfer limited

  • corrosion_assess_galvanic - NRL mixed-potential Butler-Volmer solver

  • corrosion_generate_pourbaix - E-pH stability diagrams

  • corrosion_get_material_properties - Alloy database (18+ materials)

  • corrosion_estimate_service_life - Remaining life prediction


Tier 3: Localized Corrosion

Purpose: Pitting/crevice assessment

Tools (2):

  • corrosion_assess_localized - Dual-tier pitting + crevice

    • Tier 1: PREN/CPT empirical (ASTM G48, ISO 18070)

    • Tier 2: E_pit vs E_mix mechanistic (NRL Butler-Volmer)

  • corrosion_calculate_pren - PREN calculation


Tool Count: 14 Tools

Tier

Tools

Count

Tier 0: Handbook

screen_materials, query_typical_rates, identify_mechanism

3

Tier 1: Chemistry

langelier_index, predict_scaling

2

Tier 2: Mechanistic

predict_co2_h2s, predict_aerated_chloride, assess_galvanic, generate_pourbaix, get_material_properties, estimate_service_life

6

Tier 3: Localized

assess_localized, calculate_pren

2

Info

get_server_info

1

Total

14

All tools have the corrosion_ prefix (e.g., corrosion_screen_materials).


Recent Updates

Version 0.3.0 (2025-12-15)

  • 14 MCP tools registered with corrosion_ prefix

  • CSV-backed material properties for 18+ alloys

  • All critical bug fixes from code review complete

  • 348 tests passing

Key Fixes (0.3.0)

  • Galvanic K constant corrected (A/cm² → mm/year)

  • ipy unit conversion fixed (in/y → mm/y)

  • DO scaling for user-supplied values

  • Zero-CO₂ short-circuit in NORSOK model

  • NORSOK pH clamping (prevents errors for pH > 6.5)


JSON Response Schema

All tools return standardized JSON with:

  • Central estimates (median or nominal values)

  • Uncertainty bounds (p05, p95 percentiles)

  • Provenance metadata (model, validation, sources, confidence)

Example (calculate_localized_corrosion):

{
  "pitting": {
    "CPT_C": 10.0,
    "PREN": 24.7,
    "Cl_threshold_mg_L": 233,
    "susceptibility": "critical",
    "margin_C": -15.0,
    "interpretation": "CRITICAL: T = 25.0°C exceeds CPT...",
    "E_pit_VSCE": 1.084,
    "E_mix_VSCE": 0.501,
    "electrochemical_margin_V": -0.583,
    "electrochemical_risk": "low",
    "electrochemical_interpretation": "LOW RISK: E_mix (0.501 V) is 583 mV below E_pit..."
  },
  "tier_disagreement": {
    "detected": true,
    "tier1_assessment": "critical",
    "tier2_assessment": "low",
    "explanation": "⚠️ TIER DISAGREEMENT: Tier 1 (PREN/CPT empirical) says 'critical' but Tier 2 (E_pit vs E_mix mechanistic) says 'low'. Recommendation: Trust Tier 2..."
  },
  "overall_risk": "critical",
  "recommendations": [
    "⚠️ TIER DISAGREEMENT: Trust Tier 2 for accurate assessment...",
    "CRITICAL: Immediate risk of localized corrosion..."
  ]
}

Validated Materials (Phase 3)

Material

Tier 1 (PREN/CPT)

Tier 2 (E_pit/E_mix)

Status

SS316

✅ Production-ready (seawater validated)

316L

✅ Alias → SS316

316

✅ Alias → SS316

UNS S31600/S31603

✅ Alias → SS316

HY80

⚠️

⚠️ Tier 1 only (negative ORR activation energy at seawater)

HY100

⏳ Tier 2 untested (coefficients available)

2205

✅ Tier 1 only (not in NRL DB, PREN=35)

254SMO

✅ Tier 1 only (not in NRL DB, PREN=43)


Directory Structure

corrosion-engineering-mcp/
├── server.py                           # FastMCP server
├── requirements.txt                    # Dependencies
├── .mcp.json                          # FastMCP configuration
├── README.md                           # This file
│
├── core/                               # Core architecture
│   ├── interfaces.py                   # Abstract base classes
│   ├── schemas.py                      # Pydantic models (CorrosionResult, etc.)
│   ├── state_container.py              # CorrosionContext caching
│   ├── phreeqc_adapter.py              # PHREEQC backend
│   └── localized_backend.py            # Tier 1+2 pitting backend (Phase 3)
│
├── tools/                              # MCP tool implementations
│   ├── handbook/                       # Tier 0: Semantic search
│   │   ├── material_screening.py       # ✅ screen_materials
│   │   ├── typical_rates.py            # ✅ query_typical_rates
│   │   └── mechanism_guidance.py       # ✅ identify_mechanism
│   ├── chemistry/                      # Tier 1: PHREEQC
│   │   ├── speciation.py               # ✅ run_phreeqc_speciation
│   │   └── calculate_pourbaix.py       # 🔄 calculate_pourbaix (stub)
│   └── mechanistic/                    # Tier 2: Physics models
│       ├── co2_h2s.py                  # ✅ predict_co2_h2s_corrosion
│       ├── aerated_chloride.py         # ✅ predict_aerated_chloride_corrosion
│       ├── predict_galvanic_corrosion.py # ✅ predict_galvanic_corrosion
│       └── localized_corrosion.py      # ✅ calculate_localized_corrosion (Phase 3)
│
├── utils/                              # Utility modules
│   ├── material_database.py            # Authoritative materials data
│   ├── nrl_materials.py                # NRL electrochemical database (Phase 3)
│   ├── nrl_constants.py                # Physical constants (Phase 3)
│   ├── nrl_electrochemical_reactions.py # ORR, HER, Fe oxidation (Phase 3)
│   ├── pitting_assessment.py           # E_pit calculator (Phase 3)
│   ├── redox_state.py                  # DO ↔ Eh conversion (Phase 3)
│   └── nacl_solution_chemistry.py      # NaCl solution properties (Phase 3)
│
├── external/                           # External data files
│   ├── nrl_coefficients/               # 23 CSV files (NRL Butler-Volmer)
│   └── nrl_matlab_reference/           # 12 MATLAB files (NRL validation)
│
├── tests/                              # Test suite
│   ├── test_phase3_pitting_integration.py  # ✅ 9/9 passing
│   ├── test_phase2_galvanic.py             # Phase 2 tests
│   └── test_redox_state.py                 # RedoxState module tests
│
└── docs/                               # Documentation
    ├── TIER1_VS_TIER2_PITTING_GUIDE.md     # User guide (600+ lines)
    ├── POURBAIX_PHREEQC_ROADMAP.md         # Pourbaix integration plan
    └── ...                                 # Additional documentation

Implementation Summary

Completed Features

  • Tier 0: Handbook lookup (semantic search on 2,980 chunks)

  • Tier 1: Chemistry (Langelier SI, scaling prediction)

  • Tier 2: Mechanistic physics (CO₂/H₂S, aerated chloride, galvanic, Pourbaix)

  • Tier 3: Localized corrosion (dual-tier pitting, PREN)

  • Materials: NRL database (6 alloys) + CSV database (18+ alloys)

Future Roadmap

  • Corrosion under insulation (CUI) prediction

  • Monte Carlo uncertainty quantification

  • Enhanced PHREEQC integration


Usage Examples

Example 1: Dual-Tier Pitting Assessment (Phase 3)

# SS316 in aerated seawater
result = calculate_localized_corrosion(
    material="316L",  # Alias → SS316
    temperature_C=25.0,
    Cl_mg_L=19000.0,
    pH=8.0,
    dissolved_oxygen_mg_L=8.0,  # Enables Tier 2
)

# Tier 1: Conservative CPT screening
print(f"CPT: {result['pitting']['CPT_C']}°C")             # 10.0
print(f"Tier 1 Risk: {result['pitting']['susceptibility']}")  # "critical"

# Tier 2: Mechanistic electrochemical
print(f"E_pit: {result['pitting']['E_pit_VSCE']:.3f} V_SCE")  # 1.084
print(f"E_mix: {result['pitting']['E_mix_VSCE']:.3f} V_SCE")  # 0.501
print(f"ΔE: {result['pitting']['electrochemical_margin_V']*1000:.0f} mV")  # -583
print(f"Tier 2 Risk: {result['pitting']['electrochemical_risk']}")  # "low"

# Disagreement detection
if result['tier_disagreement']['detected']:
    print(result['tier_disagreement']['explanation'])
    # "Trust Tier 2 for accurate assessment - it accounts for actual
    #  electrochemical driving force and redox conditions..."

Example 2: Galvanic Corrosion (Phase 2)

# Steel bolts in stainless flange
result = predict_galvanic_corrosion(
    anode_material="HY80",
    cathode_material="SS316",
    temperature_C=25.0,
    pH=7.5,
    chloride_mg_L=800.0,
    area_ratio_cathode_to_anode=50.0,  # Large flange, small bolts
)

print(f"Galvanic current density: {result['galvanic_current_density_A_cm2']:.2e} A/cm²")
print(f"Anode corrosion rate: {result['anode_corrosion_rate_mm_year']:.3f} mm/year")
if 'warnings' in result and result['warnings']:
    print(f"Warnings: {result['warnings']}")

Example 3: Handbook Screening (Tier 0)

result = screen_materials(
    environment="CO2-rich brine, 60°C, pCO2=0.5 bar, pH 6.8",
    candidates=["CS", "316L", "duplex_2205"],
    application="piping"
)

print(f"Material: {result.material}")
print(f"Compatibility: {result.compatibility}")
print(f"Typical rate range: {result.typical_rate_range} mm/y")

Design Decisions

Why Dual-Tier Pitting?

Decision: Combine empirical (PREN/CPT) with mechanistic (E_pit vs E_mix)

Rationale:

  • Tier 1 (PREN/CPT): Fast, conservative screening (worst-case ferric chloride test)

  • Tier 2 (E_pit vs E_mix): Mechanistic driving force accounting for redox state

  • Graceful degradation: Tier 2 optional (requires DO + NRL material), falls back to Tier 1

  • Codex validation: "Tier 1 is guaranteed, Tier 2 is opt-in... solid UX"

Why Material Aliases?

Decision: Map 316L, 316, UNS S31600 → SS316

Rationale (Codex recommendation):

  • Prevents "Tier 2 unavailable" frustration

  • Users don't need to memorize "SS316" vs "316L"

  • 6-line alias dict prevents 90% of support issues

Why Tier Disagreement Detection?

Decision: Automatic warning when Tier 1 ≠ Tier 2

Rationale (Codex recommendation):

  • "Expose the conflict explicitly" when tiers disagree

  • Clear guidance: "Trust Tier 2 for accurate assessment"

  • Example: SS316 seawater → Tier 1 "critical" vs Tier 2 "low" (Tier 2 correct)


Production Deployment

Pre-Deployment Checklist

  • All tests passing (9/9 Phase 3 integration tests)

  • Codex recommendations implemented (4/4)

  • Documentation complete (user guide, deployment checklist)

  • Known limitations documented (HY80 at seawater)

  • API backward compatible (100%)

Smoke Tests

See: PRODUCTION_DEPLOYMENT_CHECKLIST.md

Monitoring Metrics

  • Tier 2 availability rate (target: >50%)

  • Tier disagreement rate (expected: 20-40%)

  • Error rate (target: <5%)

  • Latency p95 (target: <2 seconds)


Dependencies

Current (requirements.txt):

# MCP Framework
fastmcp>=0.1.0

# Core
numpy>=1.24.0
pandas>=2.0.0
scipy>=1.10.0
pydantic>=2.0.0

# Chemistry
phreeqpython>=1.5.5

# Testing
pytest>=7.0.0
pytest-cov>=4.0.0
pytest-asyncio>=0.21.0

References

Authoritative Sources

  1. U.S. Naval Research Laboratory - Butler-Volmer electrochemical kinetics

    • Repository: USNavalResearchLaboratory/corrosion-modeling-applications (MIT)

  2. ASTM G48 - Critical Pitting Temperature tabulated data

  3. ISO 18070 / NORSOK M-506 - Chloride thresholds

  4. Garcia & Gordon (1992) - DO saturation model

Documentation


License

MIT License - See LICENSE file for details


Citation

@software{corrosion_mcp_2025,
  title={Corrosion Engineering MCP Server},
  author={Puran Water LLC},
  year={2025},
  url={https://github.com/puran-water/corrosion-engineering-mcp},
  version={0.3.0}
}

Version: 0.3.0 | Tests: 348 passing | Tools: 14

Last Updated: 2025-12-15

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/puran-water/corrosion-engineering-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server