Harden MCP tool composition

This commit is contained in:
2026-09-24 21:00:48 +02:00
parent bbaaaf31c5
commit 78b00fedf8
7 changed files with 206 additions and 27 deletions
+51
View File
@@ -3,6 +3,7 @@
from __future__ import annotations
from dataclasses import asdict, dataclass
from decimal import Decimal, ROUND_HALF_UP
from difflib import SequenceMatcher
import json
import math
@@ -738,6 +739,56 @@ def calculate_roll(
}
def transport_roll_inputs_from_roll_calculation(
result: Any,
) -> dict[str, float]:
"""Derive browser-equivalent transport inputs from a roll calculation."""
if not isinstance(result, dict) or result.get("status") != "success":
raise ValueError("roll calculation result must have status success")
calculation = result.get("calculation")
effective_inputs = result.get("effective_inputs")
if not isinstance(calculation, dict) or not isinstance(effective_inputs, dict):
raise ValueError("successful roll calculation result is incomplete")
def calculation_number(field: str) -> float:
return _transport_roll_input_number(calculation.get(field), field)
def effective_number(field: str) -> float:
entry = effective_inputs.get(field)
if not isinstance(entry, dict):
raise ValueError(f"successful roll calculation result is missing {field}")
return _transport_roll_input_number(entry.get("value"), field)
return {
"roll_diameter_mm": _browser_one_decimal(
calculation_number("average_diameter_mm")
),
"core_diameter_mm": effective_number("core_diameter_mm"),
"roll_width_m": effective_number("width_m"),
"roll_weight_kg": _browser_one_decimal(
calculation_number("roll_weight_kg")
),
"product_length_m": calculation_number("effective_roll_length_m"),
}
def _transport_roll_input_number(value: Any, field: str) -> float:
if isinstance(value, bool) or not isinstance(value, (int, float)):
raise ValueError(f"successful roll calculation result is missing {field}")
number = float(value)
if not math.isfinite(number) or number <= 0:
raise ValueError(f"successful roll calculation result has invalid {field}")
return number
def _browser_one_decimal(value: float) -> float:
"""Match the browser's positive-number ``toFixed(1)`` transport values."""
return float(
Decimal.from_float(value).quantize(Decimal("0.1"), rounding=ROUND_HALF_UP)
)
def modify_calculation(
state: CalculationState | dict[str, Any],
changes: dict[str, Any],