sympy
Execute Python/SymPy code to perform symbolic mathematics operations including algebra, calculus, and equation solving within a secure sandbox environment.
Instructions
SymPy sandbox tool: execute Python/SymPy math code.
Safety boundaries:
Only sympy/math imports and calls are allowed.
System calls, file I/O, network access, and dynamic execution are blocked.
Input rules:
Single argument: code (str).
You must print() the final answer; otherwise out may be empty.
Use multiple print() lines for multiple outputs.
Recommended workflow:
Define symbols and assumptions.
Derive/solve step by step.
Simplify intermediate expressions (simplify/factor/expand).
Print final results.
Retry guidance:
E_AST_BLOCK: remove unsafe statements and keep pure math code only.
E_TIMEOUT: reduce problem size, split steps, simplify before solving.
E_MEMORY: reduce dimensions or avoid constructing huge objects at once.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes |
Implementation Reference
- src/sym_mcp/server.py:66-118 (handler)The 'sympy' tool is registered using @mcp.tool and implemented by the 'sympy_tool' function. It validates code using an AST guard and then executes it in a worker pool.
@mcp.tool(name="sympy") async def sympy_tool(code: str) -> str: """SymPy sandbox tool: execute Python/SymPy math code. Safety boundaries: - Only sympy/math imports and calls are allowed. - System calls, file I/O, network access, and dynamic execution are blocked. Input rules: - Single argument: code (str). - You must print() the final answer; otherwise out may be empty. - Use multiple print() lines for multiple outputs. Recommended workflow: 1) Define symbols and assumptions. 2) Derive/solve step by step. 3) Simplify intermediate expressions (simplify/factor/expand). 4) Print final results. Retry guidance: - E_AST_BLOCK: remove unsafe statements and keep pure math code only. - E_TIMEOUT: reduce problem size, split steps, simplify before solving. - E_MEMORY: reduce dimensions or avoid constructing huge objects at once. """ guard = validate_code(code) if not guard.ok: parsed = parse_guard_message(guard.message, hint_level=settings.hint_level) return _build_error_response(parsed.code, parsed.line, parsed.err, parsed.hint) pool = await _get_pool() try: result = await pool.exec(code) except WorkerPoolError as exc: parsed = parse_pool_error(str(exc), hint_level=settings.hint_level) return _build_error_response(parsed.code, parsed.line, parsed.err, parsed.hint) except Exception as exc: LOGGER.exception("unexpected pool error") parsed = parse_internal_error(str(exc), hint_level=settings.hint_level) return _build_error_response(parsed.code, parsed.line, parsed.err, parsed.hint) if not result.get("ok", False): parsed = parse_pool_error("worker执行失败", hint_level=settings.hint_level) return _build_error_response(parsed.code, parsed.line, parsed.err, parsed.hint) if result.get("success", False): stdout = (result.get("stdout") or "").rstrip() out, _ = _truncate(stdout) return _json_compact({"out": out}) tb_text = result.get("traceback", "") or "" parsed = parse_traceback(tb_text, hint_level=settings.hint_level) return _build_error_response(parsed.code, parsed.line, parsed.err, parsed.hint)