calculate_mavp
Calculate Moving Average Variable Period (MAVP) for financial market analysis using variable-length periods to adapt to changing market conditions.
Instructions
Calculate Moving Average Variable Period (MAVP).
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| kwargs | Yes |
Implementation Reference
- src/mcp_talib/core/server.py:236-249 (handler)Primary handler function for the MCP tool 'calculate_mavp'. Decorated with @mcp.tool() for automatic registration. Delegates to MAVPIndicator for computation.@mcp.tool() async def calculate_mavp(close: List[float], periods: Optional[float] = None, minperiod: int = 2, maxperiod: int = 30) -> Dict[str, Any]: try: indicator = registry.get_indicator("mavp") if not indicator: raise ValueError("MAVP indicator not found") market_data = MarketData(close=close) opts = {"periods": periods, "minperiod": minperiod, "maxperiod": maxperiod} result = await indicator.calculate(market_data, opts) if result.success: return {"success": True, "values": result.values, "metadata": result.metadata} return {"success": False, "error": result.error_message} except Exception as e: return {"success": False, "error": str(e)}
- Core MAVPIndicator class containing the actual TA-Lib computation logic using ta.MAVP, input schema validation, and result formatting.class MAVPIndicator(BaseIndicator): def __init__(self): super().__init__(name="mavp", description="Moving Average with Variable Period (MAVP)") @property def input_schema(self) -> Dict[str, Any]: return { "type": "object", "properties": { "close_prices": {"type": "array", "items": {"type": "number"}}, "periods": {"type": "number"}, "minperiod": {"type": "integer", "default": 2}, "maxperiod": {"type": "integer", "default": 30}, }, "required": ["close_prices"], } async def calculate(self, market_data: MarketData, options: Dict[str, Any] = None) -> IndicatorResult: if options is None: options = {} close = np.asarray(market_data.close, dtype=float) periods = options.get("periods", None) minperiod = options.get("minperiod", 2) maxperiod = options.get("maxperiod", 30) try: # Enforce a single float `periods` to match the type expectations # in the type stubs (`_ta_lib.pyi`). Convert the single float into # an ndarray filled to the same length as `close` for TA-Lib. if periods is not None: periods_arr = np.full(close.shape[0], periods, dtype=float) out = ta.MAVP(close, periods_arr) else: out = ta.MAVP(close, None) return IndicatorResult(indicator_name=self.name, success=True, values={"mavp": out.tolist()}, metadata={"periods": periods, "minperiod": minperiod, "maxperiod": maxperiod, "input_points": len(close), "output_points": len(out)}) except Exception as e: return IndicatorResult(indicator_name=self.name, success=False, values={}, error_message=str(e))
- TOOL_SPECS entry for 'mavp' defining parameters, defaults, description, and market data mapping used in dynamic tool generation."mavp": { "description": "Moving Average Variable Period (MAVP)", "params": {"close": List[float], "periods": Optional[float], "minperiod": int, "maxperiod": int}, "defaults": {"periods": None, "minperiod": 2, "maxperiod": 30}, "market_data_args": {"close": "close"}, },
- src/mcp_talib/indicators/__init__.py:35-35 (registration)Registration of MAVPIndicator instance in the global IndicatorRegistry under key 'mavp'.registry.register("mavp", MAVPIndicator)
- Input schema property of MAVPIndicator defining expected JSON structure for close_prices, periods, minperiod, and maxperiod.def input_schema(self) -> Dict[str, Any]: return { "type": "object", "properties": { "close_prices": {"type": "array", "items": {"type": "number"}}, "periods": {"type": "number"}, "minperiod": {"type": "integer", "default": 2}, "maxperiod": {"type": "integer", "default": 30}, }, "required": ["close_prices"], }