Repository: pathintegral-institute/mcp.science
Pull request #31: Add Python version of Mathematica MCP Server
Author: login: LionSR
Created: 2025-04-22T20:41:52Z | Merged: 2025-04-26T06:18:57Z

## Add Python version of Mathematica MCP Server

This PR adds a Python implementation of the Mathematica MCP server, ported from the TypeScript version at https://github.com/texra-ai/mcp-server-mathematica.

### Features
- Execute arbitrary Mathematica code via wolframscript
- Verify mathematical derivations step by step
- Support for text, LaTeX, and Mathematica output formats

### Prerequisites
- Requires a local Mathematica installation with wolframscript in PATH
- Python >= 3.11 (are we strict about this?)
- uv package manager (recommended)

### Testing
This Python implementation needs to be tested by users with Mathematica installations, as it requires wolframscript to be accessible. Let me know any comments since i am not yet super familiar with mcpm and the required default settings. I tested it with `mcp dev src/server.py` and it seems to be activated.



Diff:
diff --git a/servers/mathematica-check/.python-version b/servers/mathematica-check/.python-version
new file mode 100644
index 0000000..902b2c9
--- /dev/null
+++ b/servers/mathematica-check/.python-version
@@ -0,0 +1 @@
+3.11
\ No newline at end of file
diff --git a/servers/mathematica-check/README.md b/servers/mathematica-check/README.md
new file mode 100644
index 0000000..f8c4b83
--- /dev/null
+++ b/servers/mathematica-check/README.md
@@ -0,0 +1,138 @@
+# Mathematica MCP Server (Python)
+
+This repository contains a Python-based Model Context Protocol (MCP) server that allows MCP clients (like Cursor) to execute Mathematica code via `wolframscript` and verify mathematical derivations.
+
+This is a Python port of the original TypeScript server.
+
+## Overview
+
+This server acts as a bridge, enabling applications that support MCP to leverage the power of a local Mathematica installation for tasks such as:
+
+*   Performing complex mathematical calculations.
+*   Verifying mathematical derivation steps provided by humans or AI models.
+*   Generating LaTeX or Mathematica string representations of expressions.
+
+## Prerequisites
+
+*   [Mathematica](https://www.wolfram.com/mathematica/) must be installed on your system.
+*   The `wolframscript` command-line utility must be available in your system's PATH. You can test this by running `wolframscript -help` in your terminal.
+*   [Python](https://www.python.org/) >= 3.12.
+*   [`uv`](https://github.com/astral-sh/uv) (recommended for managing the Python environment).
+
+## Installation
+
+1.  **Clone the repository (if you haven't already):**
+    ```bash
+    git clone <repository-url>
+    cd <repository-directory>/servers/mathematica-check
+    ```
+2.  **Set up the Python environment and install dependencies using `uv`:**
+    ```bash
+    # Create a virtual environment
+    uv venv
+
+    # Activate the environment
+    # On macOS/Linux:
+    source .venv/bin/activate
+    # On Windows (Powershell):
+    # .venv\Scripts\activate
+
+    # Install dependencies
+    uv pip install -e . # Installs in editable mode using pyproject.toml
+    ```
+
+## Running the Server
+
+To start the MCP server, ensure your virtual environment is activated, and then run:
+
+```bash
+# Using the script defined in pyproject.toml
+mathematica-check
+```
+Or explicitly:
+```bash
+python -m mathematica-check.server
+```
+Or using the MCP CLI:
+```bash
+mcp run src/server.py
+```
+
+The server will start and listen for connections from MCP clients via standard input/output (stdio).
+
+## Integration with MCP Clients (e.g., Cursor)
+
+Follow the general steps for integrating MCP servers with your client:
+
+1.  **Start the Mathematica MCP Server:** Run the server in a terminal as described above.
+2.  **Configure Your MCP Client:** Add the server to your client's configuration (e.g., `settings.json` or similar). You'll need to provide the command to run the server within its environment.
+
+    Example configuration snippet:
+    ```json
+    {
+      "mcpServers": {
+        "mathematica-check": {
+          // Option 1: Running the installed script (ensure .venv/bin is in PATH or use absolute path)
+          "command": "/path/to/your/project/servers/mathematica-check/.venv/bin/mathematica-check",
+          
+          // Option 2: Explicitly using python from the venv
+          // "command": "/path/to/your/project/servers/mathematica-check/.venv/bin/python",
+          // "args": ["-m", "mathematica-check.server"],
+          // "cwd": "/path/to/your/project/servers/mathematica-check", // Set working directory
+          
+          "disabled": false,
+          "autoApprove": [] // Optional: Add tool names ("execute_mathematica", "verify_derivation")
+        }
+        // ... other servers ...
+      }
+    }
+    ```
+    *Replace `/path/to/your/project/...` with the absolute paths on your system.* Ensure the client can execute the command within the correct virtual environment.
+
+3.  **Restart Your MCP Client:** Ensure the client detects the new server.
+
+## Available Tools
+
+The server exposes the same tools as the TypeScript version:
+
+### 1. `execute_mathematica`
+
+Executes arbitrary Mathematica code.
+
+**Input:**
+*   `code` (string): Mathematica code to execute.
+*   `format` (string, optional): Output format (`text`, `latex`, `mathematica`). Default: `text`.
+
+**Output:** `TextContent` or `ErrorContent`.
+
+### 2. `verify_derivation`
+
+Verifies a sequence of mathematical expressions.
+
+**Input:**
+*   `steps` (list[string]): List of expressions (at least two).
+*   `format` (string, optional): Output format for the report (`text`, `latex`, `mathematica`). Default: `text`.
+
+**Output:** `TextContent` or `ErrorContent`.
+
+## Troubleshooting
+
+*   **Server Not Found/Not Responding:**
+    *   Ensure the server is running (`mathematica-check` or `python -m mathematica-check.server`).
+    *   Verify the virtual environment is activated.
+    *   Check if `wolframscript` is installed and in your PATH (`wolframscript -help`).
+    *   Check the client's MCP configuration, especially the `command`, `args`, and `cwd`.
+*   **Tool Errors:**
+    *   Check the server's terminal output for logs and errors.
+    *   Verify the syntax of the Mathematica `code` or `steps`.
+    *   Ensure `steps` for `verify_derivation` is a list with at least two strings.
+*   **Python/Dependency Issues:** Ensure dependencies are installed correctly in the virtual environment using `uv pip install -e .`.
+
+## Project Structure
+
+*   `src/`: Python source code for the server.
+    *   `server.py`: Main server logic and tool definitions.
+*   `pyproject.toml`: Project metadata and dependencies (for `uv` and `pip`).
+*   `.python-version`: Specifies the required Python version (used by tools like `pyenv`).
+*   `README.md`: This file.
+*   `uv.lock`: (Generated by `uv`) Lockfile for dependencies. 
\ No newline at end of file
diff --git a/servers/mathematica-check/pyproject.toml b/servers/mathematica-check/pyproject.toml
new file mode 100644
index 0000000..3a95d04
--- /dev/null
+++ b/servers/mathematica-check/pyproject.toml
@@ -0,0 +1,18 @@
+[project]
+name = "mathematica-check"
+version = "0.1.0"
+requires-python = ">=3.11"
+description = "A Python MCP server for interacting with Mathematica/wolframscript."
+authors = [{ name = "Sirui Lu", email = "sirui.lu.phys@gmail.com" }]
+license = { text = "MIT" }
+
+dependencies = [
+    "mcp[cli]>=1.0.0",
+]
+
+[project.scripts]
+mcp-mathematica-check = "server:main"
+
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
\ No newline at end of file
diff --git a/servers/mathematica-check/setup.py b/servers/mathematica-check/setup.py
new file mode 100644
index 0000000..92c8443
--- /dev/null
+++ b/servers/mathematica-check/setup.py
@@ -0,0 +1,17 @@
+from setuptools import setup, find_namespace_packages
+
+setup(
+    name="mathematica-check",
+    version="0.1.0",
+    packages=find_namespace_packages(where="src"),
+    package_dir={"": "src"},
+    include_package_data=True,
+    entry_points={
+        "console_scripts": [
+            "mcp-mathematica-check=server:main",
+        ],
+    },
+    install_requires=[
+        "mcp[cli]>=1.0.0",
+    ],
+) 
\ No newline at end of file
diff --git a/servers/mathematica-check/src/__init__.py b/servers/mathematica-check/src/__init__.py
new file mode 100644
index 0000000..9d9e51c
--- /dev/null
+++ b/servers/mathematica-check/src/__init__.py
@@ -0,0 +1,3 @@
+"""
+Mathematica-check package for MCP server.
+""" 
\ No newline at end of file
diff --git a/servers/mathematica-check/src/server.py b/servers/mathematica-check/src/server.py
new file mode 100644
index 0000000..336160b
--- /dev/null
+++ b/servers/mathematica-check/src/server.py
@@ -0,0 +1,272 @@
+#!/usr/bin/env python
+
+"""
+MCP server for executing local Mathematica (Wolfram Script) code and returning the output.
+Python version.
+"""
+
+import subprocess
+import logging
+import json
+import asyncio
+from typing import List, Literal, Optional
+
+from mcp.server.fastmcp import FastMCP
+from mcp.types import TextContent
+
+# --- Logging Setup ---
+logging.basicConfig(
+    level=logging.INFO, format="%(asctime)s - %(levelname)s - %(name)s - %(message)s"
+)
+logger = logging.getLogger("mathematica-check")
+
+# --- MCP Server Initialization ---
+mcp = FastMCP(
+    name="mathematica-check",
+    version="0.1.0",
+)
+
+# --- Mathematica Interaction Logic ---
+
+_mathematica_checked = False
+_mathematica_available = False
+
+
+async def check_mathematica_installation() -> bool:
+    """Checks if wolframscript is installed and accessible."""
+    global _mathematica_checked, _mathematica_available
+    if _mathematica_checked:
+        return _mathematica_available
+
+    logger.info("Checking Mathematica (wolframscript) installation...")
+    try:
+        process = await asyncio.create_subprocess_exec(
+            "wolframscript", "-help", stdout=subprocess.PIPE, stderr=subprocess.PIPE
+        )
+        stdout, stderr = await process.communicate()
+
+        if process.returncode == 0:
+            logger.info("Mathematica installation verified.")
+            _mathematica_available = True
+        else:
+            logger.error(
+                f"wolframscript -help exited with code {process.returncode}. Stderr: {stderr.decode()}"
+            )
+            _mathematica_available = False
+    except FileNotFoundError:
+        logger.error("Mathematica (wolframscript) not found in PATH.")
+        _mathematica_available = False
+    except Exception as e:
+        logger.error(f"Error checking Mathematica installation: {e}", exc_info=True)
+        _mathematica_available = False
+
+    _mathematica_checked = True
+    return _mathematica_available
+
+
+async def execute_mathematica_code(code: str, format: str = "text") -> str:
+    """Executes Mathematica code using wolframscript."""
+    command = ["wolframscript", "-format", format.lower(), "-code", code]
+
+    # Avoid logging potentially large code
+    logger.info(
+        f"Executing Mathematica command: {' '.join(command[:3])} -code '<code>...'"
+    )
+    try:
+        process = await asyncio.create_subprocess_exec(
+            *command, stdout=subprocess.PIPE, stderr=subprocess.PIPE
+        )
+        stdout, stderr = await process.communicate()
+
+        stdout_str = stdout.decode().strip()
+        stderr_str = stderr.decode().strip()
+
+        if process.returncode != 0:
+            logger.error(
+                f"wolframscript execution failed (Code: {process.returncode}). Stderr: {stderr_str}. Stdout: {stdout_str}"
+            )
+            raise RuntimeError(
+                f"Mathematica execution failed: {stderr_str or stdout_str or 'Unknown error'}"
+            )
+
+        if stderr_str:
+            logger.warning(f"Mathematica execution produced stderr: {stderr_str}")
+
+        logger.info("Mathematica execution completed successfully.")
+        return stdout_str
+
+    except FileNotFoundError:
+        logger.error(
+            "wolframscript command not found. Is Mathematica installed and in PATH?"
+        )
+        raise RuntimeError("wolframscript command not found.")
+    except Exception as e:
+        logger.error(f"Failed to execute Mathematica code: {e}", exc_info=True)
+        raise RuntimeError(f"Failed to execute Mathematica code: {e}")
+
+
+async def verify_derivation_steps(steps: List[str], format: str = "text") -> str:
+    """Verifies a mathematical derivation by checking equivalence between steps."""
+    if len(steps) < 2:
+        raise ValueError("At least two steps are required for a derivation.")
+
+    logger.info(f"Verifying derivation with {len(steps)} steps.")
+
+    # Safely embed the list of steps into Mathematica code
+    # Using JSON ensures proper escaping of special characters within steps
+    steps_json = json.dumps(steps)
+
+    verification_code = f"""
+      steps = {steps_json};
+      results = {{}};
+
+      (* Check if each step follows from the previous *)
+      For[i = 2, i <= Length[steps], i++,
+        prevExpr = Check[ToExpression[steps[[i-1]], InputForm, Hold], $Failed];
+        currentExpr = Check[ToExpression[steps[[i]], InputForm, Hold], $Failed];
+
+        equivalent = False;
+        errorMsg = "";
+
+        If[prevExpr === $Failed || currentExpr === $Failed,
+            errorMsg = "Syntax error in step expression.";
+            equivalent = False;,
+
+            (* Use TimeConstrained to prevent hangs on complex Simplify *)
+            result = TimeConstrained[Simplify[ReleaseHold[prevExpr] == ReleaseHold[currentExpr]], 5, $TimedOut];
+            If[result === $TimedOut,
+                errorMsg = "Simplification timed out.";
+                equivalent = False;,
+                If[!MemberQ[{{True, False}}, result],
+                    errorMsg = "Simplification failed or produced unexpected result.";
+                    equivalent = False;
+                ,
+                    equivalent = result;
+                ];
+            ];
+        ];
+
+        AppendTo[results, <|
+          "step" -> i,
+          "expression" -> steps[[i]],
+          "equivalent" -> equivalent,
+          "error" -> errorMsg
+        |>];
+      ];
+
+      (* Format the results *)
+      formattedResults = "Derivation Verification Results:\\n\\n";
+
+      For[i = 1, i <= Length[results], i++,
+        result = results[[i]];
+        stepNum = result["step"];
+        expr = result["expression"];
+        isEquiv = result["equivalent"];
+        errMsg = result["error"];
+
+        formattedResults = formattedResults <>
+          "Step " <> ToString[stepNum] <> ": " <> expr <> "\\n" <>
+          "  Valid: " <> ToString[isEquiv];
+        If[errMsg =!= "",
+           formattedResults = formattedResults <> "\\n  Note: " <> errMsg;
+        ];
+         formattedResults = formattedResults <> "\\n\\n";
+      ];
+
+      (* Ensure final output is a string *)
+      ToString[formattedResults, OutputForm]
+    """
+    return await execute_mathematica_code(verification_code, format)
+
+
+# --- MCP Tool Definitions ---
+
+
+@mcp.tool()
+async def execute_mathematica(
+    code: str, format: Optional[Literal["text", "mathematica"]] = "text"
+) -> TextContent:
+    """
+    Execute Mathematica code and return the result.
+
+    IMPORTANT: Each code block should be self-contained and complete. Variables, functions, 
+    or definitions from previous executions are not preserved between calls.
+
+    Args:
+        code: Mathematica code to execute. Should be a complete, self-contained code block.
+        format: Output format (text, latex, or mathematica). Defaults to text.
+
+    Returns:
+        The result of the execution as text.
+
+    Raises:
+        RuntimeError: If Mathematica execution fails or wolframscript is not found.
+        ValueError: If the input code is empty.
+    """
+    logger.info(f"Received execute_mathematica request (format: {format})")
+
+    if not await check_mathematica_installation():
+        raise RuntimeError(
+            "Mathematica (wolframscript) is not installed or not accessible. Please ensure it's in your PATH."
+        )
+
+    if not code:
+        raise ValueError("Mathematica code cannot be empty.")
+
+    result = await execute_mathematica_code(code, format)
+    return TextContent(type="text", text=result)
+
+
+@mcp.tool()
+async def verify_derivation(
+    steps: List[str], format: Optional[Literal["text", "mathematica"]] = "text"
+) -> TextContent:
+    """
+    Verify a mathematical derivation step by step using Mathematica's Simplify.
+
+    Checks if Simplify[step_i == step_{i-1}] evaluates to True for i > 1.
+
+    IMPORTANT: Each step expression should be self-contained and valid Mathematica syntax.
+    The verification is performed in a single execution, so all steps are processed together.
+
+    Args:
+        steps: Array of mathematical expressions (as strings) representing steps in a derivation. Requires at least two steps.
+        format: Output format for the verification report (text, latex, or mathematica). Defaults to text.
+
+    Returns:
+        A report indicating the validity of each step.
+
+    Raises:
+        RuntimeError: If Mathematica execution fails or wolframscript is not found.
+        ValueError: If the input steps are invalid (e.g., not a list, < 2 steps).
+    """
+    logger.info(
+        f"Received verify_derivation request ({len(steps)} steps, format: {format})"
+    )
+
+    if not await check_mathematica_installation():
+        raise RuntimeError(
+            "Mathematica (wolframscript) is not installed or not accessible. Please ensure it's in your PATH."
+        )
+
+    if not steps or not isinstance(steps, list) or len(steps) < 2:
+        raise ValueError(
+            "At least two derivation steps (as a list of strings) are required."
+        )
+
+    result = await verify_derivation_steps(steps, format)
+    return TextContent(type="text", text=result)
+
+
+# --- Main Execution ---
+
+
+def main():
+    """Runs the MCP server."""
+    logger.info("Starting Mathematica MCP server (Python)...")
+    # Use the standard run method, which handles the loop for async tools
+    mcp.run("stdio")
+
+
+if __name__ == "__main__":
+    main() 
\ No newline at end of file
diff --git a/servers/mathematica-check/uv.lock b/servers/mathematica-check/uv.lock
new file mode 100644
index 0000000..5aa75ba
--- /dev/null
+++ b/servers/mathematica-check/uv.lock
@@ -0,0 +1,385 @@
+version = 1
+revision = 2
+requires-python = ">=3.11"
+
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload_time = "2024-05-20T21:33:25.928Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" },
+]
+
+[[package]]
+name = "anyio"
+version = "4.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "idna" },
+    { name = "sniffio" },
+    { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload_time = "2025-03-17T00:02:54.77Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload_time = "2025-03-17T00:02:52.713Z" },
+]
+
+[[package]]
+name = "certifi"
+version = "2025.1.31"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577, upload_time = "2025-01-31T02:16:47.166Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393, upload_time = "2025-01-31T02:16:45.015Z" },
+]
+
+[[package]]
+name = "click"
+version = "8.1.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload_time = "2024-12-21T18:38:44.339Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload_time = "2024-12-21T18:38:41.666Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "h11"
+version = "0.14.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418, upload_time = "2022-09-25T15:40:01.519Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259, upload_time = "2022-09-25T15:39:59.68Z" },
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "certifi" },
+    { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9f/45/ad3e1b4d448f22c0cff4f5692f5ed0666658578e358b8d58a19846048059/httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad", size = 85385, upload_time = "2025-04-11T14:42:46.661Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/18/8d/f052b1e336bb2c1fc7ed1aaed898aa570c0b61a09707b108979d9fc6e308/httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be", size = 78732, upload_time = "2025-04-11T14:42:44.896Z" },
+]
+
+[[package]]
+name = "httpx"
+version = "0.28.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "anyio" },
+    { name = "certifi" },
+    { name = "httpcore" },
+    { name = "idna" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload_time = "2024-12-06T15:37:23.222Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload_time = "2024-12-06T15:37:21.509Z" },
+]
+
+[[package]]
+name = "httpx-sse"
+version = "0.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624, upload_time = "2023-12-22T08:01:21.083Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819, upload_time = "2023-12-22T08:01:19.89Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "3.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" },
+]
+
+[[package]]
+name = "mathematica-check"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+    { name = "mcp", extra = ["cli"] },
+]
+
+[package.metadata]
+requires-dist = [{ name = "mcp", extras = ["cli"], specifier = ">=1.0.0" }]
+
+[[package]]
+name = "mcp"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "anyio" },
+    { name = "httpx" },
+    { name = "httpx-sse" },
+    { name = "pydantic" },
+    { name = "pydantic-settings" },
+    { name = "sse-starlette" },
+    { name = "starlette" },
+    { name = "uvicorn" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/95/d2/f587cb965a56e992634bebc8611c5b579af912b74e04eb9164bd49527d21/mcp-1.6.0.tar.gz", hash = "sha256:d9324876de2c5637369f43161cd71eebfd803df5a95e46225cab8d280e366723", size = 200031, upload_time = "2025-03-27T16:46:32.336Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/10/30/20a7f33b0b884a9d14dd3aa94ff1ac9da1479fe2ad66dd9e2736075d2506/mcp-1.6.0-py3-none-any.whl", hash = "sha256:7bd24c6ea042dbec44c754f100984d186620d8b841ec30f1b19eda9b93a634d0", size = 76077, upload_time = "2025-03-27T16:46:29.919Z" },
+]
+
+[package.optional-dependencies]
+cli = [
+    { name = "python-dotenv" },
+    { name = "typer" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "pydantic"
+version = "2.11.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "annotated-types" },
+    { name = "pydantic-core" },
+    { name = "typing-extensions" },
+    { name = "typing-inspection" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload_time = "2025-04-08T13:27:06.399Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload_time = "2025-04-08T13:27:03.789Z" },
+]
+
+[[package]]
+name = "pydantic-core"
+version = "2.33.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload_time = "2025-04-02T09:49:41.8Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224, upload_time = "2025-04-02T09:47:04.199Z" },
+    { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845, upload_time = "2025-04-02T09:47:05.686Z" },
+    { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029, upload_time = "2025-04-02T09:47:07.042Z" },
+    { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784, upload_time = "2025-04-02T09:47:08.63Z" },
+    { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075, upload_time = "2025-04-02T09:47:10.267Z" },
+    { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849, upload_time = "2025-04-02T09:47:11.724Z" },
+    { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794, upload_time = "2025-04-02T09:47:13.099Z" },
+    { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237, upload_time = "2025-04-02T09:47:14.355Z" },
+    { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351, upload_time = "2025-04-02T09:47:15.676Z" },
+    { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914, upload_time = "2025-04-02T09:47:17Z" },
+    { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385, upload_time = "2025-04-02T09:47:18.631Z" },
+    { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765, upload_time = "2025-04-02T09:47:20.34Z" },
+    { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688, upload_time = "2025-04-02T09:47:22.029Z" },
+    { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185, upload_time = "2025-04-02T09:47:23.385Z" },
+    { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640, upload_time = "2025-04-02T09:47:25.394Z" },
+    { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649, upload_time = "2025-04-02T09:47:27.417Z" },
+    { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472, upload_time = "2025-04-02T09:47:29.006Z" },
+    { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509, upload_time = "2025-04-02T09:47:33.464Z" },
+    { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702, upload_time = "2025-04-02T09:47:34.812Z" },
+    { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428, upload_time = "2025-04-02T09:47:37.315Z" },
+    { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753, upload_time = "2025-04-02T09:47:39.013Z" },
+    { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849, upload_time = "2025-04-02T09:47:40.427Z" },
+    { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541, upload_time = "2025-04-02T09:47:42.01Z" },
+    { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225, upload_time = "2025-04-02T09:47:43.425Z" },
+    { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373, upload_time = "2025-04-02T09:47:44.979Z" },
+    { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034, upload_time = "2025-04-02T09:47:46.843Z" },
+    { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848, upload_time = "2025-04-02T09:47:48.404Z" },
+    { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986, upload_time = "2025-04-02T09:47:49.839Z" },
+    { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload_time = "2025-04-02T09:47:51.648Z" },
+    { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload_time = "2025-04-02T09:47:53.149Z" },
+    { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload_time = "2025-04-02T09:47:55.006Z" },
+    { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload_time = "2025-04-02T09:47:56.532Z" },
+    { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload_time = "2025-04-02T09:47:58.088Z" },
+    { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload_time = "2025-04-02T09:47:59.591Z" },
+    { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload_time = "2025-04-02T09:48:01.397Z" },
+    { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload_time = "2025-04-02T09:48:03.056Z" },
+    { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload_time = "2025-04-02T09:48:04.662Z" },
+    { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload_time = "2025-04-02T09:48:06.226Z" },
+    { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload_time = "2025-04-02T09:48:08.114Z" },
+    { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload_time = "2025-04-02T09:48:09.708Z" },
+    { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload_time = "2025-04-02T09:48:11.288Z" },
+    { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload_time = "2025-04-02T09:48:12.861Z" },
+    { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload_time = "2025-04-02T09:48:14.553Z" },
+    { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload_time = "2025-04-02T09:48:16.222Z" },
+    { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload_time = "2025-04-02T09:48:17.97Z" },
+    { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858, upload_time = "2025-04-02T09:49:03.419Z" },
+    { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745, upload_time = "2025-04-02T09:49:05.391Z" },
+    { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188, upload_time = "2025-04-02T09:49:07.352Z" },
+    { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479, upload_time = "2025-04-02T09:49:09.304Z" },
+    { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415, upload_time = "2025-04-02T09:49:11.25Z" },
+    { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623, upload_time = "2025-04-02T09:49:13.292Z" },
+    { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175, upload_time = "2025-04-02T09:49:15.597Z" },
+    { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674, upload_time = "2025-04-02T09:49:17.61Z" },
+    { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951, upload_time = "2025-04-02T09:49:19.559Z" },
+]
+
+[[package]]
+name = "pydantic-settings"
+version = "2.9.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "pydantic" },
+    { name = "python-dotenv" },
+    { name = "typing-inspection" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234, upload_time = "2025-04-18T16:44:48.265Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356, upload_time = "2025-04-18T16:44:46.617Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.19.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload_time = "2025-01-06T17:26:30.443Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload_time = "2025-01-06T17:26:25.553Z" },
+]
+
+[[package]]
+name = "python-dotenv"
+version = "1.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload_time = "2025-03-25T10:14:56.835Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload_time = "2025-03-25T10:14:55.034Z" },
+]
+
+[[package]]
+name = "rich"
+version = "14.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "markdown-it-py" },
+    { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "sniffio"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload_time = "2024-02-25T23:20:04.057Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload_time = "2024-02-25T23:20:01.196Z" },
+]
+
+[[package]]
+name = "sse-starlette"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "anyio" },
+    { name = "starlette" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376, upload_time = "2024-12-25T09:09:30.616Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120, upload_time = "2024-12-25T09:09:26.761Z" },
+]
+
+[[package]]
+name = "starlette"
+version = "0.46.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "anyio" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846, upload_time = "2025-04-13T13:56:17.942Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload_time = "2025-04-13T13:56:16.21Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.15.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "click" },
+    { name = "rich" },
+    { name = "shellingham" },
+    { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711, upload_time = "2025-02-27T19:17:34.807Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061, upload_time = "2025-02-27T19:17:32.111Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.13.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload_time = "2025-04-10T14:19:05.416Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload_time = "2025-04-10T14:19:03.967Z" },
+]
+
+[[package]]
+name = "typing-inspection"
+version = "0.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload_time = "2025-02-25T17:27:59.638Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload_time = "2025-02-25T17:27:57.754Z" },
+]
+
+[[package]]
+name = "uvicorn"
+version = "0.34.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "click" },
+    { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload_time = "2025-04-19T06:02:50.101Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload_time = "2025-04-19T06:02:48.42Z" },
+]


Reviews:
user: login: GabrielDrapor
body: Hey there! @LionSR 

Thanks for your contribution❤️! Really appreciate. Your MCP server looks great.

Have you validated it locally on other MCP clients (Claude Desktop / Goose / ...)?

Users can actually install this MCP server without `mcpm` by git url too, e.g.:

```bash
uvx --from git+https://github.com/pathintegral-institute/mcp.science#subdirectory=servers/mathematica-check mcp-mathematica-check
```

To use it with `mcpm`, you need to add this MCP server to its registry, here's the doc for how to add: https://github.com/pathintegral-institute/mcpm.sh/blob/main/mcp-registry/README.md
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T14:59:36Z
user: login: pyq
body: I pushed a commit for testing per request from @XiaoliangQi 
This is my config from `claude_desktop_config.json`
```
{
  "mcpServers": {
    "mcp-mathematica-check": {
      "command": "uv",
      "args": [
        "--directory",
        "/Users/{your-path}/mcp.science/servers/mathematica-check",
        "run",
        "mcp-mathematica-check"
      ]
    }
  }
}
```
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T16:11:39Z
user: login: LionSR
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T20:22:05Z
user: login: LionSR
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T20:22:15Z
user: login: LionSR
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T06:49:48Z
user: login: pyq
body: LGTM, thank you for contributing! 🚢 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-25T07:00:21Z

Review comments:
diff_hunk: @@ -0,0 +1,18 @@
+[project]
+name = "mathematica-check"
+version = "0.1.0"
+requires-python = ">=3.10"
+description = "A Python MCP server for interacting with Mathematica/wolframscript."
+authors = [{ name = "Your Name", email = "you@example.com" }] # Replace with your details
+license = { text = "MIT" } # Or your preferred license
+
+dependencies = [ # Specify a version range if needed
+    "mcp[cli]>=1.0.0",
+]
+
+[project.scripts]
+mathematica-check = "mathematica_server.server:main"
path: servers/mathematica-check/pyproject.toml
user: login: GabrielDrapor
body: ```suggestion
mcp-mathematica-check = "mathematica_server.server:main"
```


nit: Consider follow our naming convention here https://github.com/pathintegral-institute/mcp.science?tab=readme-ov-file#contributing
created_at: 2025-04-23T14:57:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1 @@
+3.11
path: servers/mathematica-check/.python-version
user: login: pyq
body: The Python version seems to differ from the required prerequisites.
created_at: 2025-04-23T15:17:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,138 @@
+# Mathematica MCP Server (Python)
+
+This repository contains a Python-based Model Context Protocol (MCP) server that allows MCP clients (like Cursor) to execute Mathematica code via `wolframscript` and verify mathematical derivations.
+
+This is a Python port of the original TypeScript server.
+
+## Overview
+
+This server acts as a bridge, enabling applications that support MCP to leverage the power of a local Mathematica installation for tasks such as:
+
+*   Performing complex mathematical calculations.
+*   Verifying mathematical derivation steps provided by humans or AI models.
+*   Generating LaTeX or Mathematica string representations of expressions.
+
+## Prerequisites
+
+*   [Mathematica](https://www.wolfram.com/mathematica/) must be installed on your system.
+*   The `wolframscript` command-line utility must be available in your system's PATH. You can test this by running `wolframscript -help` in your terminal.
+*   [Python](https://www.python.org/) >= 3.12.
+*   [`uv`](https://github.com/astral-sh/uv) (recommended for managing the Python environment).
+
+## Installation
+
+1.  **Clone the repository (if you haven't already):**
+    ```bash
+    git clone <repository-url>
+    cd <repository-directory>/servers/mathematica-check
+    ```
+2.  **Set up the Python environment and install dependencies using `uv`:**
+    ```bash
+    # Create a virtual environment
+    uv venv
+
+    # Activate the environment
+    # On macOS/Linux:
+    source .venv/bin/activate
+    # On Windows (Powershell):
+    # .venv\Scripts\activate
+
+    # Install dependencies
+    uv pip install -e . # Installs in editable mode using pyproject.toml
+    ```
+
+## Running the Server
+
+To start the MCP server, ensure your virtual environment is activated, and then run:
+
+```bash
+# Using the script defined in pyproject.toml
+mathematica-check
+```
+Or explicitly:
+```bash
+python -m mathematica_server.server
+```
+Or using the MCP CLI:
+```bash
+mcp run src/mathematica_server/server.py
path: servers/mathematica-check/README.md
user: login: pyq
body: The server path seems to be incorrect? which might be `src/server.py`
created_at: 2025-04-23T15:27:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1 @@
+3.11
path: servers/mathematica-check/.python-version
user: login: LionSR
body: thanks! I don't have a opinion on this just that the computer I tested happened to only have Python 3.11. however I did notice that most of the other MCPs gin the repos are 3.12 so feel free to standardize 
created_at: 2025-04-23T20:22:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,138 @@
+# Mathematica MCP Server (Python)
+
+This repository contains a Python-based Model Context Protocol (MCP) server that allows MCP clients (like Cursor) to execute Mathematica code via `wolframscript` and verify mathematical derivations.
+
+This is a Python port of the original TypeScript server.
+
+## Overview
+
+This server acts as a bridge, enabling applications that support MCP to leverage the power of a local Mathematica installation for tasks such as:
+
+*   Performing complex mathematical calculations.
+*   Verifying mathematical derivation steps provided by humans or AI models.
+*   Generating LaTeX or Mathematica string representations of expressions.
+
+## Prerequisites
+
+*   [Mathematica](https://www.wolfram.com/mathematica/) must be installed on your system.
+*   The `wolframscript` command-line utility must be available in your system's PATH. You can test this by running `wolframscript -help` in your terminal.
+*   [Python](https://www.python.org/) >= 3.12.
+*   [`uv`](https://github.com/astral-sh/uv) (recommended for managing the Python environment).
+
+## Installation
+
+1.  **Clone the repository (if you haven't already):**
+    ```bash
+    git clone <repository-url>
+    cd <repository-directory>/servers/mathematica-check
+    ```
+2.  **Set up the Python environment and install dependencies using `uv`:**
+    ```bash
+    # Create a virtual environment
+    uv venv
+
+    # Activate the environment
+    # On macOS/Linux:
+    source .venv/bin/activate
+    # On Windows (Powershell):
+    # .venv\Scripts\activate
+
+    # Install dependencies
+    uv pip install -e . # Installs in editable mode using pyproject.toml
+    ```
+
+## Running the Server
+
+To start the MCP server, ensure your virtual environment is activated, and then run:
+
+```bash
+# Using the script defined in pyproject.toml
+mathematica-check
+```
+Or explicitly:
+```bash
+python -m mathematica_server.server
+```
+Or using the MCP CLI:
+```bash
+mcp run src/mathematica_server/server.py
path: servers/mathematica-check/README.md
user: login: LionSR
body: Thanks!
created_at: 2025-04-23T20:22:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,18 @@
+[project]
+name = "mathematica-check"
+version = "0.1.0"
+requires-python = ">=3.10"
+description = "A Python MCP server for interacting with Mathematica/wolframscript."
+authors = [{ name = "Your Name", email = "you@example.com" }] # Replace with your details
+license = { text = "MIT" } # Or your preferred license
+
+dependencies = [ # Specify a version range if needed
+    "mcp[cli]>=1.0.0",
+]
+
+[project.scripts]
+mathematica-check = "mathematica_server.server:main"
path: servers/mathematica-check/pyproject.toml
user: login: LionSR
body: Good catch, thanks!
created_at: 2025-04-24T06:49:48Z
author_association: CONTRIBUTOR

PR comments:
user: login: LionSR
created_at: 2025-04-23T20:23:25Z
body: > I pushed a commit for testing per request from @XiaoliangQi 
> 
> This is my config from `claude_desktop_config.json`
> 
> ```
> 
> {
> 
>   "mcpServers": {
> 
>     "mcp-mathematica-check": {
> 
>       "command": "uv",
> 
>       "args": [
> 
>         "--directory",
> 
>         "/Users/{your-path}/mcp.science/servers/mathematica-check",
> 
>         "run",
> 
>         "mcp-mathematica-check"
> 
>       ]
> 
>     }
> 
>   }
> 
> }
> 
> ```

Did it work for you on Claude-desktop? It should work like the typescript version: https://claude.ai/share/da7c847e-a4c6-4997-944d-105bc4f647f6
author_association: CONTRIBUTOR
user: login: pyq
created_at: 2025-04-24T09:12:38Z
body: > > I pushed a commit for testing per request from @XiaoliangQi
> > This is my config from `claude_desktop_config.json`
> > ```
> > 
> > {
> > 
> >   "mcpServers": {
> > 
> >     "mcp-mathematica-check": {
> > 
> >       "command": "uv",
> > 
> >       "args": [
> > 
> >         "--directory",
> > 
> >         "/Users/{your-path}/mcp.science/servers/mathematica-check",
> > 
> >         "run",
> > 
> >         "mcp-mathematica-check"
> > 
> >       ]
> > 
> >     }
> > 
> >   }
> > 
> > }
> > ```
> 
> Did it work for you on Claude-desktop? It should work like the typescript version: https://claude.ai/share/da7c847e-a4c6-4997-944d-105bc4f647f6


I don’t have Mathematica installed locally, but I’m able to run the MCP tools using the configuration above. 
Just make sure to update the path to match your own setup
https://claude.ai/share/59ad77af-cd5a-491f-a8f3-728dd484d785
author_association: CONTRIBUTOR
user: login: LionSR
created_at: 2025-04-24T11:47:12Z
body: Thanks everyone @pyq @GabrielDrapor @XiaoliangQi  for taking a look. I made a couple of changes to fix the inconsistent directory issue, fixed a format issue, and optimized a bit the prompt. 

https://claude.ai/share/9fc54e96-93b3-4409-8334-be72b0e6a142

It is now working pretty nicely on my desktop. (where it verified some Jordan-Wigner transformations) with the json config provided in the Claude desktop.

Also worked with `mcp dev src/server.py`
<img width="1294" alt="image" src="https://github.com/user-attachments/assets/fde75c9d-42bb-47ad-99b8-defdb0344def" />


Let me know if anything else is needed!

author_association: CONTRIBUTOR