MCP server providing a scientific computing stack for LLMs
mcp-scicomp provides 9 scientific computing tools with strong domain-specific descriptions and comprehensive parameter schemas. All tools have descriptions (averaging ~150-250 chars, within the 10-1024 baseline), all parameters are typed and described, and output schemas are documented in docstrings. Tools follow verb_noun naming (eigenanalysis, solve_ode, optimize, etc.) and are domain-appropriate. However, critical issues reduce the score: (1) No input schema validation or constraints visible in code (e.g., optimize's 'method' param lists allowed values in description but no enum in schema); (2) Error handling is minimal, most tools return dicts with 'error' keys but lack recovery guidance or actionable next steps; (3) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being READ_ONLY; (4) Mutually exclusive parameters (matrix vs file_path) documented in text but not enforced via JSON Schema oneOf; (5) Output fields are documented in docstrings but not in structured schema format visible to LLMs at call time. The codebase is well-written and scientifically sound, but tool interface design does not fully follow Arcade patterns for LLM-friendly composition and error recovery.
Compute descriptive statistics and normality test for a numeric sample. Use this tool for exploratory data analysis: summary stats, distribution shape, and a histogram. Accepts inline data or a file (CSV/TSV/Excel/JSON/Parquet).
Compute eigenvalues, eigenvectors, and spectral properties of a square matrix. Use this tool when you need to analyse the spectral structure of a matrix: stability of a dynamical system, PCA preprocessing, condition number diagnostics, or positive-definiteness checks.
Fit parametric distributions to a dataset and rank them by AIC. Use this tool to find which probability distribution best describes your data. Fits multiple distributions via MLE and ranks them by AIC/BIC and KS test.
Perform a frequentist hypothesis test on one or two samples. Use this tool to test statistical hypotheses. Supports t-tests, Mann-Whitney U, Kolmogorov-Smirnov, and Shapiro-Wilk normality tests.
Decompose a matrix using SVD, LU, QR, or Cholesky factorisation. Use this tool for dimensionality reduction (SVD), solving linear systems (LU/QR), verifying positive-definiteness (Cholesky), or inspecting the rank structure of a matrix.
No JSON Schema enums for constrained parameters. The 'method' parameter in optimize/matrix_decomposition/solve_ode lists allowed values in description text ('One of: svd, lu, qr, cholesky') but does not declare enum in the JSON Schema. LLMs cannot parse description text constraints reliably, they need formal enum declarations.
Mutually exclusive parameters not enforced in schema. eigenanalysis, matrix_decomposition, describe_data, fit_distribution, and hypothesis_test accept 'matrix' OR 'file_path' but cannot enforce mutual exclusion in JSON Schema. Code checks at runtime and returns error dict, but LLMs see both as optional and may pass both or neither, forcing retry.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 23 | - | v1 |
Minimize, maximize, or find the root of a mathematical objective function. Use this tool for unconstrained/constrained optimization, global optimization, or single-variable root finding (finding x where f(x) = 0).
Plot the 2D phase portrait of an autonomous ODE system dx/dt=f(x,y), dy/dt=g(x,y). Use this tool to visualize the vector field and solution trajectories of a 2D autonomous system. Useful for analyzing fixed points, limit cycles, and stability.
Solve a system of ODEs as an initial value problem (IVP). Use this tool to integrate first-order ODE systems dy/dt = f(t, y). Higher-order ODEs must be rewritten as first-order systems. Returns the solution time series and a plot.
Solve a 1-D time-dependent PDE using the Method of Lines (MOL). Use this tool when you need to simulate heat diffusion, wave propagation, or any custom parabolic/hyperbolic PDE in one spatial dimension. The PDE is discretised in space with central finite differences and integrated in time with scipy's RK45 solver. Convenience presets (set pde_type to trigger them): - "heat" → u_t = alpha * d2u_dx2, alpha defaults to 0.01 - "wave" → u_tt = c**2 * d2u_dx2, c defaults to 1.0 For custom equations set pde_type to "parabolic" (u_t = rhs) or "hyperbolic" (u_tt = rhs) and supply spatial_rhs.
No tool annotations despite declared risk levels. All tools are marked Risk: READ_ONLY in metadata but tool definitions lack readOnlyHint, destructiveHint, or idempotentHint annotations. LLMs cannot infer safety properties without explicit hints.
Error messages lack recovery guidance. When eigenanalysis receives a non-square matrix, it returns {'error': 'eigenanalysis requires a square matrix; got shape (3, 2).', 'suggestion': 'Provide an n×n matrix.'}, helpful but does not guide LLM to a tool or concrete next action. Per pattern:recovery-guide, errors should say 'Try [tool_name]' or provide a corrective action.
Output schemas documented in docstrings, not in response schema format. Each tool's docstring describes the return dict structure (e.g. 'eigenvalues', 'eigenvectors', 'spectral_radius') but this information is not accessible to LLMs via structured response metadata. LLMs must infer output fields from tool name and description alone.
Missing numeric constraints for unbounded parameters. solve_ode's 'n_points' defaults to 300 with no stated upper bound; phase_portrait's 'grid_points' defaults to 20 with no maximum; solve_pde_1d's 'n_x' and 'n_t' have minimums (>= 3, >= 50) but no maximums. LLMs could pass extreme values causing timeouts or memory exhaustion.
No pagination or result limiting for data tools. describe_data and fit_distribution accept file paths with no stated size limit. If an agent passes a 1GB CSV, the tool will load it entirely into memory. No limit warnings or streaming results.