Click on "Install 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., "@Corrosion Engineering MCP Servercheck if SS316 is suitable for seawater at 25°C with 19,000 mg/L chloride"
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.
Corrosion Engineering MCP Server
Physics-Based Corrosion Rate Prediction via Model Context Protocol
⚠️ 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 -vMCP 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 ✅
Self-describing Tier 2 unavailability:
electrochemical_interpretationexplains WHY (not justnull)RedoxState warnings surfaced: DO saturation, anaerobic conditions appended to interpretation
Material alias mapping: 316L, 316, UNS S31600 → SS316 (6 aliases supported)
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 compatibilitycorrosion_query_typical_rates- Empirical corrosion ratescorrosion_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 servicecorrosion_predict_aerated_chloride- O₂ mass transfer limitedcorrosion_assess_galvanic- NRL mixed-potential Butler-Volmer solvercorrosion_generate_pourbaix- E-pH stability diagramscorrosion_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 + creviceTier 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_prefixCSV-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 documentationImplementation 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.0References
Authoritative Sources
U.S. Naval Research Laboratory - Butler-Volmer electrochemical kinetics
Repository: USNavalResearchLaboratory/corrosion-modeling-applications (MIT)
ASTM G48 - Critical Pitting Temperature tabulated data
ISO 18070 / NORSOK M-506 - Chloride thresholds
Garcia & Gordon (1992) - DO saturation model
Documentation
User Guide: docs/TIER1_VS_TIER2_PITTING_GUIDE.md
Deployment: PRODUCTION_DEPLOYMENT_CHECKLIST.md
MCP Config: MCP_CONFIGURATION.md
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
This server cannot be installed
Resources
Looking for Admin?
Admins can modify the Dockerfile, update the server description, and track usage metrics. If you are the server author, to access the admin panel.