[project] name = "mathematica_mcp" version = "0.1.11" description = "MCP server for WolframScript" keywords = ["mcp", "model-context-protocol", "mathematica", "wolframscript"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Topic :: Scientific/Engineering :: Mathematics", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Framework :: Pydantic", "Framework :: Pydantic :: 2", "Operating System :: OS Independent", "Typing :: Typed", ] readme = "README.md" authors = [{ name = "Lars Nilse", email = "l.nilse@dunelm.org.uk" }] license = "MIT" requires-python = ">=3.10,<3.14" dependencies = [ "loguru>=0.7.3", "pydantic>=2.10.6", "pydantic-settings>=2.8.1", "fastmcp>=2.13.0.1", ] [dependency-groups] dev = [ "pytest>=8.3.4", "pytest-xdist>=3.6.1", "pytest-cov>=6.0.0", "pytest-asyncio>=0.25.3", "pytest-mock>=3.15.1", "ruff>=0.9.5", "pylint>=3.3.4", "pyright>=1.1.404", ] [project.urls] Homepage = "https://github.com/lars20070/mathematica-mcp" Repository = "https://github.com/lars20070/mathematica-mcp" Issues = "https://github.com/lars20070/mathematica-mcp/issues" [project.scripts] mathematica-mcp = "mathematica_mcp.server:wolframscript_server" [tool.ruff] line-length = 150 lint.select = [ "E", # pycodestyle "F", # pyflakes "I", # isort "TID", # tidy imports "UP", # pyupgrade "C4", # comprehensions "SIM", # simplifications "PD", # pandas-specific rules "NPY", # numpy-specific rules "PL", # pylint "B", # bugbear "ANN", # type annotations "TC", # type checking ] lint.ignore = [ "SIM108", # Ignore ternary operators rule i.e. allow if-else blocks "PLR2004", # Allow magic values "PLR0915", # Allow long functions "PLR0912", # Allow many branches "PLR0913", # Allow many arguments "TC006", # Allow type casting without strings ] lint.pydocstyle.convention = "google" [tool.pyright] # Core Settings typeCheckingMode = "basic" # next step: "standard" pythonVersion = "3.10" venvPath = "." venv = ".venv" # Paths include = ["src", "tests"] exclude = [ ".git", ".venv", "dist", "uml", "**/__pycache__", ] strict = [] # If you really really want strict checking for parts of the code # High-value Rules reportOptionalMemberAccess = "error" reportOptionalSubscript = "error" reportOptionalCall = "error" reportGeneralTypeIssues = "error" reportReturnType = "error" # Grey Area reportAttributeAccessIssue = "warning" # Noisy Rules reportUnknownParameterType = false reportUnknownVariableType = false reportMissingParameterType = false reportMissingTypeStubs = false reportPrivateUsage = false [tool.pytest.ini_options] asyncio_default_fixture_loop_scope = "function" # Use "session" for a single event loop for all tests or "function" for a new event loop for every test (more isolation). markers = [ "wolframscript: tests requiring a local WolframScript installation", ] [tool.coverage.run] branch = true source = ["mathematica_mcp"] parallel = true disable_warnings = ["module-not-measured"] omit = [ "tests/*", ] [tool.coverage.report] show_missing = true # Show line numbers of missing coverage in terminal skip_covered = false # Show all files, including those with full coverage skip_empty = true # Skip files with no statements precision = 1 # Show coverage to 1 decimal place exclude_lines = [ "pragma: no cover", # Don't count lines marked to be excluded "raise NotImplementedError", # Don't count abstract methods "if __name__ == .__main__.:", # Don't count main entry points "if TYPE_CHECKING:", # Don't count type checking blocks ] [tool.coverage.html] directory = "coverage" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/mathematica_mcp"]