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


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

  • Production Ready: 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