A multi-server MCP orchestration system with LangChain integration. Provides a FastAPI backend that connects to multiple MCP servers (matrix operations, Towers of Hanoi, web search, weather, time) and exposes them through a LangChain agent with a web frontend.
10 tools with basic schemas and descriptions, but significant gaps in parameter documentation and error handling. Most tools have verb-noun naming (get_, solve_, search_) which is good. Descriptions range 30-200 chars, meeting baseline minimums. However, 7 of 10 tools lack parameter descriptions entirely (e.g., solve_hanoi's 'n' parameter has no description of valid range or constraints). Error handling is minimal, most tools return generic error dicts without recovery guidance. No tool annotations (readOnlyHint, destructiveHint) despite all being READ_ONLY. Output schemas are documented in docstrings but not formally in JSON Schema. Matrix tools show better parameter documentation than time/weather/search tools.
Compute eigenvalues and eigenvectors of a square matrix. Returns: { "eigenvalues": [ ... ], "eigenvectors": [[...], ...] # columns are eigenvectors }
Returns the current server time in 'YYYY-MM-DD HH:MM:SS' format.
Returns the current backend server time (local tool).
Gets current weather (temperature, humidity, wind, condition_code) for a city. Uses open-meteo.com.
Compute the inverse of a square matrix. Returns: { "inverse": [[...], ...] }
Compute the determinant of a square matrix. Returns: { "determinant": float }
7 of 10 tools lack parameter descriptions. solve_hanoi's 'n' parameter has no description of valid range (n >= 1). search_internet's 'query' parameter has no guidance on format or length. get_weather's 'city' parameter undocumented. LLMs cannot infer constraints from names alone.
No tool annotations despite all tools being READ_ONLY. FastMCP supports readOnlyHint via @mcp.tool decorator. Adding readOnlyHint=True signals to agents these are safe to call without confirmation.
Error handling returns generic error dicts without recovery guidance. solve_hanoi returns {'error': 'N must be >= 1'} but does not suggest what valid values are. Matrix tools catch exceptions and return {'error': str(e)}, raw exception messages are not actionable for LLMs.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Multiply two matrices A and B (A @ B). Returns: { "product": [[...], ...] }
Compute the rank of a matrix. Returns: { "rank": int }
Search the web for information using SearXNG. Returns top 10 results with title, url, and snippet.
Solve the Towers of Hanoi problem for n disks. Returns: - moves: list of "A -> C" style moves - count: total number of moves
Output schemas documented only in docstrings, not formally in JSON Schema. LLMs cannot parse docstring examples reliably. Matrix tools return complex numbers as {'real': ..., 'imag': ...} but this structure is not declared in a schema.
search_internet returns 'top 10 results' but no pagination or limit parameter. If SearXNG returns 100+ results, all are returned, potentially exhausting context. No limit parameter to cap results.