oceanographic-seawater-properties
$
npx mdskill add InternScience/scp/oceanographic-seawater-properties```python import asyncio import json from mcp.client.streamable_http import streamablehttp_client from mcp import ClientSession
SKILL.md
.github/skills/oceanographic-seawater-propertiesView on GitHub ↗
---
name: oceanographic-seawater-properties
description: Calculate seawater thermodynamic properties using TEOS-10 standard including density, salinity, sound speed, and freezing temperature for oceanography.
license: MIT license
metadata:
skill-author: PJLab
---
# Oceanographic Seawater Properties (TEOS-10)
## Usage
### 1. MCP Server Definition
```python
import asyncio
import json
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
class OceanGSWClient:
"""Ocean GSW (Gibbs SeaWater) MCP Client"""
def __init__(self, server_url: str, api_key: str):
self.server_url = server_url
self.api_key = api_key
self.session = None
async def connect(self):
print(f"Connecting to: {self.server_url}")
try:
self.transport = streamablehttp_client(
url=self.server_url,
headers={"SCP-HUB-API-KEY": self.api_key}
)
self.read, self.write, self.get_session_id = await self.transport.__aenter__()
self.session_ctx = ClientSession(self.read, self.write)
self.session = await self.session_ctx.__aenter__()
await self.session.initialize()
print("✓ connect success")
return True
except Exception as e:
print(f"✗ connect failure: {e}")
return False
async def disconnect(self):
try:
if self.session:
await self.session_ctx.__aexit__(None, None, None)
if hasattr(self, 'transport'):
await self.transport.__aexit__(None, None, None)
print("✓ already disconnect")
except Exception as e:
print(f"✗ disconnect error: {e}")
def parse_result(self, result):
try:
if hasattr(result, 'content') and result.content:
content = result.content[0]
if hasattr(content, 'text'):
return json.loads(content.text)
return str(result)
except Exception as e:
return {"error": f"parse error: {e}", "raw": str(result)}
```
### 2. Seawater Properties Calculation Workflow
Calculate seawater thermodynamic properties following the TEOS-10 (Thermodynamic Equation of Seawater - 2010) international standard.
**Workflow Steps:**
1. **Convert to Absolute Salinity** - Convert practical salinity to absolute salinity
2. **Calculate Density** - Compute seawater density
3. **Calculate Sound Speed** - Determine speed of sound in seawater
4. **Calculate Freezing Temperature** - Find freezing point
5. **Calculate Conservative Temperature** - Get conservative temperature from potential temperature
**Implementation:**
```python
## Initialize client
client = OceanGSWClient(
"https://scp.intern-ai.org.cn/api/v1/mcp/34/OceanGSW-Tool",
"<your-api-key>"
)
if not await client.connect():
print("connection failed")
exit()
print("=== Oceanographic Seawater Properties (TEOS-10) ===\n")
## Input parameters for typical ocean conditions
practical_salinity = 35.0 # PSU (practical salinity units)
temperature = 10.0 # °C (in-situ temperature)
pressure = 1000.0 # dbar (approximately 1000m depth)
longitude = -30.0 # degrees E
latitude = 20.0 # degrees N
## Step 1: Convert practical salinity to absolute salinity
print("Step 1: Convert to Absolute Salinity")
result = await client.session.call_tool(
"SA_from_SP",
arguments={
"SP": practical_salinity,
"p": pressure,
"lon": longitude,
"lat": latitude
}
)
absolute_salinity = client.parse_result(result)
print(f"Practical Salinity: {practical_salinity} PSU")
print(f"Absolute Salinity: {absolute_salinity} g/kg\n")
## Step 2: Calculate seawater density
print("Step 2: Calculate Seawater Density")
result = await client.session.call_tool(
"rho",
arguments={
"SA": absolute_salinity,
"CT": temperature,
"p": pressure
}
)
density = client.parse_result(result)
print(f"Density: {density} kg/m³\n")
## Step 3: Calculate speed of sound
print("Step 3: Calculate Sound Speed")
result = await client.session.call_tool(
"sound_speed",
arguments={
"SA": absolute_salinity,
"CT": temperature,
"p": pressure
}
)
sound_speed = client.parse_result(result)
print(f"Sound Speed: {sound_speed} m/s\n")
## Step 4: Calculate freezing temperature
print("Step 4: Calculate Freezing Temperature")
result = await client.session.call_tool(
"t_freezing",
arguments={
"SA": absolute_salinity,
"p": pressure,
"saturation_fraction": 0.0 # 0 for air-free, 1 for air-saturated
}
)
freezing_temp = client.parse_result(result)
print(f"Freezing Temperature: {freezing_temp}°C\n")
## Step 5: Calculate potential temperature
print("Step 5: Calculate Potential Temperature")
result = await client.session.call_tool(
"pt_from_t",
arguments={
"SA": absolute_salinity,
"t": temperature,
"p": pressure,
"p_ref": 0.0 # Reference pressure (0 for surface)
}
)
potential_temp = client.parse_result(result)
print(f"In-situ Temperature: {temperature}°C")
print(f"Potential Temperature: {potential_temp}°C\n")
await client.disconnect()
```
### Tool Descriptions
**OceanGSW-Tool Server (TEOS-10 Standard):**
- `SA_from_SP`: Convert practical salinity to absolute salinity
- Args: `SP` (PSU), `p` (dbar), `lon` (deg E), `lat` (deg N)
- Returns: Absolute salinity (g/kg)
- `rho`: Calculate seawater density
- Args: `SA` (g/kg), `CT` (°C), `p` (dbar)
- Returns: Density (kg/m³)
- `sound_speed`: Calculate speed of sound in seawater
- Args: `SA` (g/kg), `CT` (°C), `p` (dbar)
- Returns: Sound speed (m/s)
- `t_freezing`: Calculate freezing temperature
- Args: `SA` (g/kg), `p` (dbar), `saturation_fraction` (0-1)
- Returns: Freezing temperature (°C)
- `pt_from_t`: Calculate potential temperature from in-situ temperature
- Args: `SA` (g/kg), `t` (°C), `p` (dbar), `p_ref` (dbar)
- Returns: Potential temperature (°C)
### Input/Output
**Inputs:**
- **Practical Salinity (SP)**: PSU (practical salinity units), typically 32-37 for open ocean
- **Absolute Salinity (SA)**: g/kg, accounts for non-salt materials
- **Temperature (t, CT)**: °C, in-situ or conservative temperature
- **Pressure (p)**: dbar, approximately equal to depth in meters
- **Longitude**: degrees East
- **Latitude**: degrees North
**Outputs:**
- Absolute salinity: g/kg
- Density: kg/m³
- Sound speed: m/s
- Freezing temperature: °C
- Potential temperature: °C
### Use Cases
- Oceanographic research and monitoring
- Climate modeling and ocean circulation studies
- Underwater acoustics and sonar applications
- Marine biology habitat characterization
- Ocean engineering and offshore operations
- Fisheries science
- Sea level and ocean heat content studies
### TEOS-10 Overview
TEOS-10 (Thermodynamic Equation of Seawater - 2010) is the international standard for seawater properties:
- Replaces the older EOS-80 standard
- Uses **Absolute Salinity** instead of Practical Salinity
- Uses **Conservative Temperature** instead of Potential Temperature
- Provides consistent thermodynamic framework
- Essential for accurate ocean property calculations
### Physical Interpretations
**Absolute vs Practical Salinity:**
- Practical Salinity: Based on conductivity measurement
- Absolute Salinity: Mass fraction of dissolved material (includes non-salt components)
- Difference typically ~0.5 g/kg but varies regionally
**Seawater Density:**
- Increases with salinity and pressure
- Decreases with temperature
- Typical ocean: 1020-1030 kg/m³
- Critical for ocean circulation and stratification
**Sound Speed:**
- Increases with temperature, salinity, and pressure
- Typical ocean: 1480-1540 m/s
- Critical for sonar, acoustic communication, seismic studies
**Freezing Temperature:**
- Decreases with salinity
- Increases with pressure (unusual property)
- Seawater freezes at ~-2°C at surface
### Additional Ocean Tools
The OceanGSW-Tool server provides 50+ TEOS-10 functions including:
- `alpha`: Thermal expansion coefficient
- `beta`: Haline contraction coefficient
- `chem_potential_water`: Chemical potential
- `cp`: Specific heat capacity
- `enthalpy`: Specific enthalpy
- `entropy`: Specific entropy
- `internal_energy`: Specific internal energy
- `Nsquared`: Brunt-Väisälä frequency (ocean stability)
- `sigma0`, `sigma1`, `sigma2`, `sigma3`, `sigma4`: Potential density anomalies
- `spiciness0`, `spiciness1`, `spiciness2`: Water mass spiciness
### Pressure Conversion
- 1 dbar ≈ 1 meter depth (very close approximation)
- Surface pressure: 0 dbar
- 1000 m depth: ~1000 dbar
- 10000 m depth (Mariana Trench): ~10000 dbar