NumPy Calculator

# server.py from typing import List, Union, Optional, Tuple import numpy as np from numpy.typing import NDArray from mcp.server.fastmcp import FastMCP # Create an MCP server mcp = FastMCP("Numpy") # Add an addition tool @mcp.tool() def add(a: int, b: int) -> int: """Add two numbers. Args: a (int): First number to add b (int): Second number to add Returns: int: Sum of the two numbers """ return a + b @mcp.tool() def matrix_multiply( matrix_a: List[List[float]], matrix_b: List[List[float]] ) -> List[List[float]]: """Multiply two matrices using NumPy. Args: matrix_a (List[List[float]]): First input matrix matrix_b (List[List[float]]): Second input matrix Returns: List[List[float]]: Result of matrix multiplication Raises: ValueError: If matrices have incompatible dimensions """ try: result = np.matmul(np.array(matrix_a), np.array(matrix_b)) return result.tolist() except ValueError as e: raise ValueError(f"Matrix multiplication failed: {str(e)}") from e @mcp.tool() def statistical_analysis( data: List[float] ) -> dict[str, float]: """Perform statistical analysis on a dataset. Args: data (List[float]): Input data for analysis Returns: dict[str, float]: Dictionary containing statistical measures """ arr = np.array(data) return { "mean": float(np.mean(arr)), "median": float(np.median(arr)), "std": float(np.std(arr)), "min": float(np.min(arr)), "max": float(np.max(arr)) } @mcp.tool() def eigen_decomposition( matrix: List[List[float]] ) -> Tuple[List[float], List[List[float]]]: """Compute eigenvalues and eigenvectors of a square matrix. Args: matrix (List[List[float]]): Input square matrix Returns: Tuple[List[float], List[List[float]]]: Eigenvalues and eigenvectors Raises: ValueError: If matrix is not square or computation fails """ try: arr = np.array(matrix) eigenvalues, eigenvectors = np.linalg.eig(arr) return eigenvalues.tolist(), eigenvectors.tolist() except np.linalg.LinAlgError as e: raise ValueError(f"Eigendecomposition failed: {str(e)}") from e @mcp.tool() def polynomial_fit( x: List[float], y: List[float], degree: int = 2 ) -> List[float]: """Fit a polynomial to the given data points. Args: x (List[float]): X coordinates y (List[float]): Y coordinates degree (int, optional): Degree of polynomial. Defaults to 2. Returns: List[float]: Coefficients of the fitted polynomial """ coefficients = np.polyfit(x, y, degree) return coefficients.tolist()