Skip to main content
Glama
sdiehl
by sdiehl

Symbolic Algebra MCP Server

Sympy-MCP is a Model Context Protocol server for allowing LLMs to autonomously perform symbolic mathematics and computer algebra. It exposes numerous tools from SymPy's core functionality to MCP clients for manipulating mathematical expressions and equations.

Why?

Language models are absolutely abysmal at symbolic manipulation. They hallucinate variables, make up random constants, permute terms and generally make a mess. But we have computer algebra systems specifically built for symbolic manipulation, so we can use tool-calling to orchestrate a sequence of transforms so that the symbolic kernel does all the heavy lifting.

While you can certainly have an LLM generate Mathematica or Python code, if you want to use the LLM as an agent or on-the-fly calculator, it's a better experience to use the MCP server and expose the symbolic tools directly.

The server exposes a subset of symbolic mathematics capabilities including algebraic equation solving, integration and differentiation, vector calculus, tensor calculus for general relativity, and both ordinary and partial differential equations.

For example, you can ask it in natural language to solve a differential equation:

Solve the damped harmonic oscillator with forcing term: the mass-spring-damper system described by the differential equation where m is mass, c is the damping coefficient, k is the spring constant, and F(t) is an external force.

$$ m\frac{d^2x}{dt^2} + c\frac{dx}{dt} + kx = F(t) $$

Or involving general relativity:

Compute the trace of the Ricci tensor $R_{\mu\nu}$ using the inverse metric $g^{\mu\nu}$ for Anti-de Sitter spacetime to determine its constant scalar curvature $R$.

Related MCP server: ReasonForge

Usage

You need uv first.

  • Homebrew : brew install uv

  • Curl : curl -LsSf https://astral.sh/uv/install.sh | sh

Then you can install and run the server with the following commands:

# Setup the project
git clone https://github.com/sdiehl/sympy-mcp.git
cd sympy-mcp
uv sync

# Install the server to Claude Desktop
uv run mcp install server.py

# Run the server
uv run mcp run server.py

You should see the server available in the Claude Desktop app now. For other clients, see below.

If you want a completely standalone version that just runs with a single command, you can use the following. Note this is running arbitrary code from Github, so be careful.

uv run --with https://github.com/sdiehl/sympy-mcp/releases/download/0.1/sympy_mcp-0.1.0-py3-none-any.whl python server.py

If you want to do general relativity calculations, you need to install the einsteinpy library.

uv sync --group relativity

Available Tools

The sympy-mcp server provides the following tools for symbolic mathematics:

Tool

Tool ID

Description

Variable Introduction

intro

Introduces a variable with specified assumptions and stores it

Multiple Variables

intro_many

Introduces multiple variables with specified assumptions simultaneously

Expression Parser

introduce_expression

Parses an expression string using available local variables and stores it

LaTeX Printer

print_latex_expression

Prints a stored expression in LaTeX format, along with variable assumptions

Algebraic Solver

solve_algebraically

Solves an equation algebraically for a given variable over a given domain

Linear Solver

solve_linear_system

Solves a system of linear equations

Nonlinear Solver

solve_nonlinear_system

Solves a system of nonlinear equations

Function Variable

introduce_function

Introduces a function variable for use in differential equations

ODE Solver

dsolve_ode

Solves an ordinary differential equation

PDE Solver

pdsolve_pde

Solves a partial differential equation

Standard Metric

create_predefined_metric

Creates a predefined spacetime metric (e.g. Schwarzschild, Kerr, Minkowski)

Metric Search

search_predefined_metrics

Searches available predefined metrics

Tensor Calculator

calculate_tensor

Calculates tensors from a metric (Ricci, Einstein, Weyl tensors)

Custom Metric

create_custom_metric

Creates a custom metric tensor from provided components and symbols

Tensor LaTeX

print_latex_tensor

Prints a stored tensor expression in LaTeX format

Simplifier

simplify_expression

Simplifies a mathematical expression using SymPy's canonicalize function

Substitution

substitute_expression

Substitutes a variable with an expression in another expression

Integration

integrate_expression

Integrates an expression with respect to a variable

Differentiation

differentiate_expression

Differentiates an expression with respect to a variable

Coordinates

create_coordinate_system

Creates a 3D coordinate system for vector calculus operations

Vector Field

create_vector_field

Creates a vector field in the specified coordinate system

Curl

calculate_curl

Calculates the curl of a vector field

Divergence

calculate_divergence

Calculates the divergence of a vector field

Gradient

calculate_gradient

Calculates the gradient of a scalar field

Unit Converter

convert_to_units

Converts a quantity to given target units

Unit Simplifier

quantity_simplify_units

Simplifies a quantity with units

Matrix Creator

create_matrix

Creates a SymPy matrix from the provided data

Determinant

matrix_determinant

Calculates the determinant of a matrix

Matrix Inverse

matrix_inverse

Calculates the inverse of a matrix

Eigenvalues

matrix_eigenvalues

Calculates the eigenvalues of a matrix

Eigenvectors

matrix_eigenvectors

Calculates the eigenvectors of a matrix

By default variables are predefined with assumptions (similar to how the symbols() function works in SymPy). Unless otherwise specified the defaut assumptions is that a variable is complex, commutative, term over the complex field $\mathbb{C}$.

Property

Value

commutative

true

complex

true

finite

true

infinite

false

Claude Desktop Setup

Normally the mcp install command will automatically add the server to the claude_desktop_config.json file. If it doesn't you need to find the config file and add the following:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Add the following to the mcpServers object, replacing /ABSOLUTE_PATH_TO_SYMPY_MCP/server.py with the absolute path to the sympy-mcp server.py file.

{
  "mcpServers": {
    "sympy-mcp": {
      "command": "/opt/homebrew/bin/uv",
      "args": [
        "run",
        "--with",
        "einsteinpy",
        "--with",
        "mcp[cli]",
        "--with",
        "pydantic",
        "--with",
        "sympy",
        "mcp",
        "run",
        "/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py"
      ]
    }
  }
}

Cursor Setup

In your ~/.cursor/mcp.json, add the following, where ABSOLUTE_PATH_TO_SYMPY_MCP is the path to the sympy-mcp server.py file.

{
  "mcpServers": {
    "sympy-mcp": {
      "command": "/opt/homebrew/bin/uv",
      "args": [
        "run",
        "--with",
        "einsteinpy",
        "--with",
        "mcp[cli]",
        "--with",
        "pydantic",
        "--with",
        "sympy",
        "mcp",
        "run",
        "/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py"
      ]
    }
  }
}

VS Code Setup

VS Code and VS Code Insiders now support MCPs in agent mode. For VS Code, you may need to enable Chat > Agent: Enable in the settings.

  1. One-click Setup:

Install in VS Code

Install in VS Code Insiders

OR manually add the config to your settings.json (global):

{
  "mcp": {
    "servers": {
      "sympy-mcp": {
        "command": "uv",
        "args": [
          "run",
          "--with",
          "einsteinpy",
          "--with",
          "mcp[cli]",
          "--with",
          "pydantic",
          "--with",
          "sympy",
          "mcp",
          "run",
          "/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py"
        ]
      }
    }
  }
}
  1. Click "Start" above the server config switch to agent mode in the chat, and try commands like "integrate x^2" or "solve x^2 = 1" to get started.

Cline Setup

To use with Cline, you need to manually run the MCP server first using the commands in the "Usage" section. Once the MCP server is running, open Cline and select "MCP Servers" at the top.

Then select "Remote Servers" and add the following:

  • Server Name: sympy-mcp

  • Server URL: http://127.0.0.1:8081/sse

5ire Setup

Another MCP client that supports multiple models (o3, o4-mini, DeepSeek-R1, etc.) on the backend is 5ire.

To set up with 5ire, open 5ire and go to Tools -> New and set the following configurations:

  • Tool Key: sympy-mcp

  • Name: SymPy MCP

  • Command: /opt/homebrew/bin/uv run --with einsteinpy --with mcp[cli] --with pydantic --with sympy mcp run /ABSOLUTE_PATH_TO/server.py

Replace /ABSOLUTE_PATH_TO/server.py with the actual path to your sympy-mcp server.py file.

HTTP Transport (Streamable HTTP / SSE)

The server supports MCP over HTTP using the streamable-http transport introduced in MCP spec 2025-03-26. This replaces the legacy SSE transport and exposes a single /mcp endpoint that clients connect to over HTTP.

This is the recommended transport when running the server as a standalone process or in a container, because it allows any HTTP-capable MCP client to connect without needing to launch the server as a subprocess.

# Run locally with HTTP transport
uv run python server.py --transport streamable-http

# Override host/port
uv run python server.py --transport streamable-http --mcp-host 127.0.0.1 --mcp-port 9000

The legacy --transport sse flag is still supported for backward compatibility.

A /healthcheck endpoint is also exposed that runs a full MCP protocol round-trip (initialize → tools/list → session teardown) and returns {"status": "ok", "tool_count": N}.

Running in Container

You can build and run the server using Docker locally:

# Build the Docker image
docker build -t sympy-mcp .

# Run the Docker container
docker run -p 8081:8081 sympy-mcp

Or use Docker Compose from the docker/ directory:

cd docker
docker compose up -d --build

Alternatively, you can pull the pre-built image from GitHub Container Registry:

# Pull the latest image
docker pull ghcr.io/sdiehl/sympy-mcp:main

# Run the container
docker run -p 8081:8081 --rm ghcr.io/sdiehl/sympy-mcp:main

To configure Claude Desktop to launch the Docker container, edit your claude_desktop_config.json file:

{
  "mcpServers": {
    "sympy-mcp": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "-p",
        "8081:8081",
        "--rm",
        "sympy-mcp"
      ]
    }
  }
}

Or to use the pre-built container from GitHub:

{
  "mcpServers": {
    "sympy-mcp": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "-p",
        "8081:8081",
        "--rm",
        "ghcr.io/sdiehl/sympy-mcp:main"
      ]
    }
  }
}

This configuration tells Claude Desktop to launch the Docker container when needed. Make sure to build the Docker image (docker build -t sympy-mcp .) before using Claude Desktop with this configuration.

The other installation methods can also be adapted to work with Docker if you change the uv command to use the docker run command instead.

Example Interaction 1 : Differential Equations

Here's an example of how the tool-calling works in a conversation with an AI assistant using this MCP server:

User: Solve the damped harmonic oscillator with forcing term: the mass-spring-damper system described by the differential equation where m is mass, c is the damping coefficient, k is the spring constant, and F(t) is an external force.

$$ m\frac{d^2x}{dt^2} + c\frac{dx}{dt} + kx = F(t) $$

Assistant: (Internal tool call) intro_many to introduce variables:

{
  "variables": [
    {"var_name": "t", "pos_assumptions": ["real"], "neg_assumptions": []},
    {"var_name": "m", "pos_assumptions": ["real", "positive"], "neg_assumptions": []},
    {"var_name": "c", "pos_assumptions": ["real", "positive"], "neg_assumptions": []},
    {"var_name": "k", "pos_assumptions": ["real", "positive"], "neg_assumptions": []}
  ]
}

Assistant: (Internal tool call) introduce_function to define x(t):

{
  "func_name": "x"
}

Assistant: (Internal tool call) introduce_expression to create the differential equation:

{
  "expr_str": "Eq(m*Derivative(x(t), t, t) + c*Derivative(x(t), t) + k*x(t), F(t))"
}

Assistant: (Internal tool call) print_latex_expression to display the equation nicely:

{
  "expr_key": "expr_12"
}

Result:

$$ c \frac{d}{d t} x{\left(t \right)} + k x{\left(t \right)} + m \frac{d^{2}}{d t^{2}} x{\left(t \right)} = F{\left(t \right)} $$

Assistant: (Internal tool call) introduce_function to define F(t):

{
  "func_name": "F"
}

Assistant: (Internal tool call) dsolve_ode to solve the differential equation:

{
  "expr_key": "expr_12",
  "func_name": "x"
}

Result:

$$ x{\left(t \right)} = C_{1} e^{\frac{t \left(- c + \sqrt{c^{2} - 4 k m}\right)}{2 m}} + C_{2} e^{- \frac{t \left(c + \sqrt{c^{2} - 4 k m}\right)}{2 m}} + \cdots $$

Example Interaction 2: General Relativity

User: Compute the trace of the Ricci tensor $R_{\mu\nu}$ using the inverse metric $g^{\mu\nu}$ for Anti-de Sitter spacetime to determine its constant scalar curvature $R$.

Assistant: (Internal tool call) create_predefined_metric to create the Anti-de Sitter metric:

{
  "metric_name": "AntiDeSitter"
}

Assistant: (Internal tool call) calculate_tensor to calculate the Ricci tensor:

{
  "metric_key": "metric_AntiDeSitter",
  "tensor_type": "RICCI_TENSOR",
  "simplify_result": true
}

Assistant: (Internal tool call) print_latex_tensor to display the Ricci tensor:

{
  "tensor_key": "riccitensor_metric_AntiDeSitter"
}

Result:

$$ \left[\begin{matrix}3 & 0 & 0 & 0\\0 & - 3 \cos^{2}{\left(t \right)} & 0 & 0\\0 & 0 & - 3 \cos^{2}{\left(t \right)} \sinh^{2}{\left(\chi \right)} & 0\\0 & 0 & 0 & - 3 \sin^{2}{\left(\theta \right)} \cos^{2}{\left(t \right)} \sinh^{2}{\left(\chi \right)}\end{matrix}\right] $$

Assistant: (Internal tool call) calculate_tensor to calculate the Ricci scalar:

{
  "metric_key": "metric_AntiDeSitter",
  "tensor_type": "RICCI_SCALAR",
  "simplify_result": true
}

Assistant: (Internal tool call) print_latex_tensor to display the Ricci scalar:

{
  "tensor_key": "ricciscalar_metric_AntiDeSitter"
}

Result:

$$ -12 $$

Example Interaction 3: Coupled ODE System (Fluid Dynamics)

This example demonstrates solving a coupled system of ODEs and verifying the solution against an algebraic steady-state analysis — a task where LLMs typically hallucinate without a CAS to ground each step.

User:

Use the sympy-mcp tools to solve this symbolically — do not compute by hand.

Two cylindrical tanks are connected by a pipe. Tank 1 has cross-sectional area A₁ = 2 m² and receives a constant inflow of Q = 0.5 m³/s. Water drains from Tank 1 into Tank 2 through a pipe with flow rate proportional to the height difference: q₁₂ = k·(h₁ - h₂) where k = 0.3 m²/s. Tank 2 has cross-sectional area A₂ = 1 m² and drains to the outside at rate q₂ = k·h₂ with the same k.

Set up and solve the coupled system of ODEs for the water heights h₁(t) and h₂(t), starting from empty tanks (h₁(0) = 0, h₂(0) = 0). Then find the steady-state heights as t → ∞ by solving the equilibrium equations algebraically, and verify they match the long-term solution of the ODEs.

Assistant: (Internal tool chain)

  1. intro_many — introduce t, k, A1, A2, Q with real/positive assumptions

  2. introduce_function × 2 — introduce h1(t) and h2(t) as unknown functions

  3. introduce_expression × 2 — encode the mass-balance ODEs:

$$A_1 \frac{dh_1}{dt} = Q - k(h_1 - h_2), \quad A_2 \frac{dh_2}{dt} = k(h_1 - h_2) - k h_2$$

  1. substitute_expression — substitute numeric values for k, A1, A2, Q

  2. dsolve_ode × 2 — solve the coupled system; apply initial conditions via substitute_expression

  3. introduce_expression × 2 — encode equilibrium equations (derivatives set to zero)

  4. solve_linear_system — solve the 2×2 algebraic system for h1*, h2*

  5. print_latex_expression — display both the time-domain solution and the steady-state values

Security Disclaimer

This server runs on your computer and gives the language model access to run Python logic. Notably it uses Sympy's parse_expr to parse mathematical expressions, which is uses eval under the hood, effectively allowing arbitrary code execution. By running the server, you are trusting the code that Claude generates. Running in the Docker image is slightly safer, but it's still a good idea to review the code before running it.

License

Copyright 2025 Stephen Diehl.

This project is licensed under the Apache 2.0 License. See the LICENSE file for details.

Available Tools

32 tools
calculate_curlA

Calculates the curl of a vector field using SymPy's curl function.

Args:
    vector_field_key: The key of the vector field expression.

Example:
    # First create a coordinate system
    create_coordinate_system("R")

    # Create a vector field F = (y, -x, 0)
    vector_field = create_vector_field("R", "R_y", "-R_x", "0")

    # Calculate curl
    curl_result = calculate_curl(vector_field)
    # Returns (0, 0, -2)

Returns:
    A key for the curl expression.
ParametersJSON Schema
NameRequiredDescriptionDefault
vector_field_keyYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the tool's function and includes an example with expected output, but lacks details on error handling, performance characteristics, or side effects (e.g., whether it modifies state). This is adequate but has gaps for a tool with no annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a purpose statement, parameter explanation, example, and return value note. It is appropriately sized and front-loaded, though the example could be slightly more concise. Every sentence adds value, with no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (mathematical operation with dependencies), no annotations, and no output schema, the description is reasonably complete. It covers purpose, parameter semantics, usage example, and return value. However, it could improve by addressing error cases or linking more explicitly to sibling tools for context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description compensates by explaining the parameter's meaning ('The key of the vector field expression') and showing its usage in the example. It clarifies that the parameter references a previously created vector field, adding significant value beyond the schema's basic type information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculates the curl of a vector field using SymPy's curl function.' It specifies the verb ('calculates'), resource ('curl of a vector field'), and implementation method ('using SymPy's curl function'), distinguishing it from siblings like calculate_divergence or calculate_gradient.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context through an example showing prerequisite steps (creating a coordinate system and vector field) and the tool's role in a workflow. However, it does not explicitly state when to use this tool versus alternatives like calculate_divergence or when not to use it, which prevents a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calculate_divergenceA

Calculates the divergence of a vector field using SymPy's divergence function.

Args:
    vector_field_key: The key of the vector field expression.

Example:
    # First create a coordinate system
    create_coordinate_system("R")

    # Create a vector field F = (x, y, z)
    vector_field = create_vector_field("R", "R_x", "R_y", "R_z")

    # Calculate divergence
    div_result = calculate_divergence(vector_field)
    # Returns 3

Returns:
    A key for the divergence expression.
ParametersJSON Schema
NameRequiredDescriptionDefault
vector_field_keyYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the mathematical operation and includes an example showing the return value. However, it doesn't mention error conditions (e.g., what happens with invalid vector_field_key), performance characteristics, or side effects (e.g., whether it modifies state). The example helps but leaves behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and appropriately sized. It starts with a clear purpose statement, provides parameter documentation, includes a practical example with workflow context, and specifies the return value. Every sentence adds value without redundancy, and the example is directly relevant to tool usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's mathematical nature, single parameter, and lack of output schema, the description is quite complete. It explains what the tool does, how to use it with an example, and what it returns. However, it doesn't cover edge cases or error handling, which would be helpful for a computational tool. The example provides good context but doesn't make it fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema, which has 0% description coverage. It explains that 'vector_field_key' refers to 'The key of the vector field expression' and shows in the example how this key is obtained from create_vector_field. This clarifies the parameter's purpose and expected format, compensating well for the schema's lack of documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Calculates the divergence of a vector field using SymPy's divergence function.' It specifies the exact mathematical operation (divergence calculation), the resource (vector field), and the implementation method (SymPy). This distinguishes it from siblings like calculate_curl or calculate_gradient, which perform different vector calculus operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context through the example, showing that this tool should be used after creating a coordinate system and vector field. However, it doesn't explicitly state when NOT to use it or name alternatives (like calculate_curl for curl operations). The example implies a workflow but lacks explicit exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calculate_gradientA

Calculates the gradient of a scalar field using SymPy's gradient function.

Args:
    scalar_field_key: The key of the scalar field expression.

Example:
    # First create a coordinate system
    create_coordinate_system("R")

    # Create a scalar field f = x^2 + y^2 + z^2
    scalar_field = introduce_expression("R_x**2 + R_y**2 + R_z**2")

    # Calculate gradient
    grad_result = calculate_gradient(scalar_field)
    # Returns (2x, 2y, 2z)

Returns:
    A key for the gradient vector field expression.
ParametersJSON Schema
NameRequiredDescriptionDefault
scalar_field_keyYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool uses SymPy's gradient function and returns a key for a gradient vector field expression, but doesn't mention error conditions, performance characteristics, or what happens with invalid inputs. The example helps but doesn't cover all behavioral aspects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (description, args, example, returns) and front-loaded with the core purpose. The example is detailed but necessary for understanding usage. Some minor redundancy exists between the description and example.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the mathematical complexity, no annotations, no output schema, and 0% schema coverage, the description does a good job explaining the tool's purpose, parameter, and usage through example. It covers the essential context but could benefit from more explicit behavioral details like error handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage and only 1 parameter, the description compensates well by explaining what 'scalar_field_key' represents (the key of the scalar field expression) and showing its usage in the example. It adds meaningful context beyond the bare schema, though it could specify format constraints for the key.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('calculates') and resource ('gradient of a scalar field'), and distinguishes it from siblings by specifying it uses SymPy's gradient function. It explicitly differentiates from tools like calculate_curl or calculate_divergence by focusing on gradient calculation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context through an example showing prerequisite steps (creating coordinate system and scalar field) and when to use this tool. However, it doesn't explicitly state when NOT to use it or mention specific alternatives like calculate_curl or calculate_divergence for different operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calculate_tensorC

Calculates a tensor from a metric using einsteinpy.symbolic.

ParametersJSON Schema
NameRequiredDescriptionDefault
metric_keyYes
simplify_resultNo
tensor_typeYes

TDQS

C2.4/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the action ('calculates') without detailing traits such as computational complexity, error handling, output format, or dependencies on state (e.g., from 'create_predefined_metric'). This leaves critical behavioral aspects unspecified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's function without unnecessary words. It's appropriately sized and front-loaded, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of tensor calculations, no annotations, no output schema, and low schema coverage, the description is incomplete. It lacks details on behavior, parameter usage, and output, making it inadequate for an AI agent to effectively invoke the tool without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage and 3 parameters, the description adds no meaning beyond the schema. It doesn't explain what 'metric_key', 'tensor_type', or 'simplify_result' represent, their expected formats, or valid values (e.g., types of tensors). This fails to compensate for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool 'Calculates a tensor from a metric using einsteinpy.symbolic', which provides a verb ('calculates') and resource ('tensor from a metric'), but it's vague about what specific tensor is calculated and how it differs from siblings like 'calculate_curl' or 'calculate_divergence'. It mentions the library 'einsteinpy.symbolic' for context, but lacks specificity in distinguishing its purpose from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. With many sibling tools like 'calculate_curl', 'calculate_divergence', and 'create_custom_metric', the description fails to specify scenarios, prerequisites, or exclusions for using 'calculate_tensor', leaving the agent without context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_to_unitsA

Converts a quantity to the given target units using sympy.physics.units.convert_to.

Args:
    expr_key: The key of the expression (previously introduced) to convert.
    target_units: List of unit names as strings (e.g., ["meter", "1/second"]).
    unit_system: Optional unit system (from UnitSystem enum). Defaults to SI.

The following units are available by default:
    SI base units: meter, second, kilogram, ampere, kelvin, mole, candela
    Length: kilometer, millimeter
    Mass: gram
    Energy: joule
    Force: newton
    Pressure: pascal
    Power: watt
    Electric: coulomb, volt, ohm, farad, henry
    Constants: speed_of_light, gravitational_constant, planck

IMPORTANT: For compound units like meter/second, you must separate the numerator and
denominator into separate units in the list. For example:
- For meter/second: use ["meter", "1/second"]
- For newton*meter: use ["newton", "meter"]
- For kilogram*meter²/second²: use ["kilogram", "meter**2", "1/second**2"]

Example:
    # Convert speed of light to kilometers per hour
    expr_key = introduce_expression("speed_of_light")
    result = convert_to_units(expr_key, ["kilometer", "1/hour"])
    # Returns approximately 1.08e9 kilometer/hour

    # Convert gravitational constant to CGS units
    expr_key = introduce_expression("gravitational_constant")
    result = convert_to_units(expr_key, ["centimeter**3", "1/gram", "1/second**2"], UnitSystem.CGS)

SI prefixes (femto, pico, nano, micro, milli, centi, deci, deca, hecto, kilo, mega, giga, tera)
can be used directly with base units.

Returns:
    A key for the converted expression, or an error message.
ParametersJSON Schema
NameRequiredDescriptionDefault
expr_keyYes
target_unitsYes
unit_systemNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does well by explaining the return behavior ('Returns: A key for the converted expression, or an error message'), listing available units, detailing compound unit formatting rules, and mentioning SI prefixes. It also references dependencies on other tools ('introduce_expression'). The main gap is lack of information about error conditions beyond the generic mention.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Args, unit listings, formatting rules, example, Returns). Most sentences earn their place by providing essential information. However, the unit listing section is quite lengthy and could potentially be summarized or referenced rather than enumerated, slightly affecting conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of unit conversion with formatting rules and dependencies on other tools, the description is quite complete. It covers parameters thoroughly, explains the workflow, provides examples, and describes return behavior. The main gap is the lack of output schema, but the description compensates by explaining the return value. Some edge cases around error conditions could be more explicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by providing detailed semantics for all 3 parameters. It explains 'expr_key' as referencing previously introduced expressions, 'target_units' with formatting rules and examples, and 'unit_system' with its optional nature and default. The description adds substantial value beyond the bare schema, including examples and unit listings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verbs ('converts a quantity') and resources ('using sympy.physics.units.convert_to'). It distinguishes itself from sibling tools by focusing on unit conversion rather than mathematical operations like differentiation, integration, or solving equations. The description explicitly mentions the underlying library and conversion functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context about when to use this tool by explaining it converts previously introduced expressions (referencing 'expr_key' from 'introduce_expression'). It includes an example showing the workflow with 'introduce_expression' first. However, it doesn't explicitly state when NOT to use this tool or mention alternatives among the siblings, though the distinct purpose makes alternatives less relevant.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_coordinate_systemA

Creates a 3D coordinate system for vector calculus operations.

Args:
    name: The name for the coordinate system.
    coord_names: Optional list of coordinate names (3 names for x, y, z).
                If not provided, defaults to [name+'_x', name+'_y', name+'_z'].

Example:
    # Create a coordinate system
    coord_sys = create_coordinate_system("R")
    # Creates a coordinate system R with coordinates R_x, R_y, R_z

    # Create a coordinate system with custom coordinate names
    coord_sys = create_coordinate_system("C", ["rho", "phi", "z"])

Returns:
    The name of the created coordinate system.
ParametersJSON Schema
NameRequiredDescriptionDefault
coord_namesNo
nameYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It clearly describes the creation behavior, default values for coord_names, and the return value. However, it doesn't mention potential side effects (e.g., if it modifies global state), error conditions, or performance considerations, leaving some behavioral aspects unclear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and appropriately sized. It starts with a clear purpose statement, followed by parameter explanations, and then practical examples. Every sentence adds value without redundancy, making it easy to understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, 0% schema coverage, and no output schema, the description does an excellent job explaining parameters, behavior, and return values. However, it doesn't address potential errors or prerequisites, which would be helpful for a creation tool. The examples enhance completeness but some edge cases remain uncovered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema, which has 0% description coverage. It explains the purpose of 'name' and provides detailed semantics for 'coord_names', including default behavior and examples. This fully compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Creates a 3D coordinate system for vector calculus operations.' It specifies the verb ('creates'), resource ('3D coordinate system'), and context ('for vector calculus operations'), distinguishing it from siblings like create_custom_metric or create_vector_field.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through examples but doesn't explicitly state when to use this tool versus alternatives like create_custom_metric or create_predefined_metric. It provides context for vector calculus operations but lacks explicit guidance on tool selection among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_custom_metricC

Creates a custom metric tensor from provided components and symbols.

ParametersJSON Schema
NameRequiredDescriptionDefault
componentsYes
configNoll
symbolsYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but offers minimal behavioral insight. It implies a write operation ('creates') but doesn't disclose if this modifies global state, requires specific permissions, has side effects (e.g., overwriting existing metrics), or handles errors (e.g., invalid components). For a creation tool with zero annotation coverage, this leaves critical behavioral traits unclear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero wasted words. It front-loads the core action ('creates a custom metric tensor') and specifies the inputs ('from provided components and symbols'), making it easy to parse. Every element earns its place, adhering to ideal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (creating a mathematical tensor with 3 parameters), lack of annotations, and no output schema, the description is incomplete. It doesn't explain the result (e.g., returns a tensor object, stores it in state), parameter details, or usage context. For a tool in a math/physics-oriented server with many siblings, this leaves too many gaps for reliable agent use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate but only vaguely references 'components and symbols' without explaining their roles, formats, or relationships. It doesn't clarify what 'components' (arrays of strings) represent mathematically, how 'symbols' (array of strings) relate to them, or the meaning of 'config' (enum 'll'/'uu'). This fails to add meaningful context beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('creates') and the resource ('a custom metric tensor'), specifying it's built 'from provided components and symbols'. This distinguishes it from sibling tools like 'create_predefined_metric' (which likely uses pre-built metrics) and 'create_matrix' (which creates a different mathematical object). However, it doesn't explicitly contrast with all siblings (e.g., 'create_coordinate_system'), keeping it from a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing components and symbols defined first), compare it to 'create_predefined_metric' for simpler cases, or specify contexts like tensor analysis in physics/math. Without such context, an agent might struggle to choose between this and other creation tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_matrixB

Creates a SymPy matrix from the provided data.

Args:
    matrix_data: A list of lists representing the rows and columns of the matrix.
                Each element can be a number or a string expression.
    matrix_var_name: Optional name for storing the matrix. If not provided, a
                     sequential name will be generated.

Example:
    # Create a 2x2 matrix with numeric values
    matrix_key = create_matrix([[1, 2], [3, 4]], "M")

    # Create a matrix with symbolic expressions (assuming x, y are defined)
    matrix_key = create_matrix([["x", "y"], ["x*y", "x+y"]])

Returns:
    A key for the stored matrix.
ParametersJSON Schema
NameRequiredDescriptionDefault
matrix_dataYes
matrix_var_nameNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool creates a matrix and stores it (implied by 'key for the stored matrix'), but lacks details on behavioral traits like error handling (e.g., invalid data), side effects (e.g., state persistence), or performance considerations. It adds some context (e.g., optional naming, sequential generation) but is incomplete for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, args, example, returns) and uses bullet points for readability. It's appropriately sized—each sentence adds value, such as clarifying data types and providing examples. However, the example section is slightly verbose with two cases, though both are illustrative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (2 parameters, mutation operation) and lack of annotations or output schema, the description is partially complete. It covers the core functionality and parameters well but misses behavioral details (e.g., what happens on failure, storage limits) and doesn't fully explain the return value ('key for the stored matrix') in context of the system. It's adequate but has gaps for safe agent use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must compensate. It effectively explains both parameters: 'matrix_data' as 'a list of lists representing rows and columns' with examples of numeric and string expressions, and 'matrix_var_name' as an optional name with default behavior. This adds significant meaning beyond the bare schema, though it doesn't cover all edge cases (e.g., empty lists).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Creates a SymPy matrix from the provided data.' It specifies the verb ('creates') and resource ('SymPy matrix'), making the function unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'create_vector_field' or 'create_custom_metric', which might also create mathematical objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'matrix_determinant' or 'solve_linear_system' that might be related, nor does it specify prerequisites (e.g., needing SymPy installed or defined variables). The examples show usage but don't explain context or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_predefined_metricC

Creates a predefined spacetime metric.

ParametersJSON Schema
NameRequiredDescriptionDefault
metric_nameYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Creates' implies a write operation, but it doesn't specify permissions, side effects, or what 'predefined' means (e.g., whether it's from a library or user-defined). This leaves key behavioral traits unclear for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no wasted words. It is front-loaded and appropriately sized for the tool's apparent complexity, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, 0% schema coverage, and no output schema, the description is incomplete. It lacks details on what the tool returns, how it interacts with other tools, or the nature of 'predefined' metrics, leaving significant gaps for understanding and usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it adds no information about the 'metric_name' parameter. With only one parameter, the baseline is 4, but the description fails to explain what 'metric_name' represents or valid values, resulting in a lower score due to insufficient compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the action ('creates') and resource ('predefined spacetime metric'), which is clear but vague. It doesn't specify what a 'predefined spacetime metric' entails or how it differs from sibling tools like 'create_custom_metric' or 'search_predefined_metrics', leaving the purpose somewhat ambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. With siblings like 'create_custom_metric' and 'search_predefined_metrics', the description lacks context on prerequisites, typical use cases, or exclusions, offering minimal help for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_vector_fieldA

Creates a vector field in the specified coordinate system.

Args:
    coord_sys_name: The name of the coordinate system to use.
    component_x: String expression for the x-component of the vector field.
    component_y: String expression for the y-component of the vector field.
    component_z: String expression for the z-component of the vector field.

Example:
    # First create a coordinate system
    create_coordinate_system("R")

    # Create a vector field F = (y, -x, z)
    vector_field = create_vector_field("R", "R_y", "-R_x", "R_z")

Returns:
    A key for the vector field expression.
ParametersJSON Schema
NameRequiredDescriptionDefault
component_xYes
component_yYes
component_zYes
coord_sys_nameYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that the tool returns 'A key for the vector field expression,' which provides some behavioral context about the output format. However, it doesn't disclose important behavioral traits like whether this is a state-modifying operation (likely yes, given 'creates'), what happens if the coordinate system doesn't exist, or whether there are any constraints on the string expressions. The example helps but doesn't cover all behavioral aspects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, args, example, returns) and appropriately sized. Every sentence earns its place by adding value. The example is particularly helpful. It could be slightly more concise by integrating the example more tightly, but overall it's efficient and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of creating mathematical objects and the complete lack of annotations and output schema, the description does a reasonable job. It explains the purpose, parameters, provides an example, and mentions the return format. However, for a tool that likely modifies system state and has mathematical constraints, it could benefit from more behavioral context about error conditions, expression validation, or how the created vector field integrates with other tools in the system.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides excellent parameter semantics beyond the input schema. With 0% schema description coverage, the schema only provides titles and types. The description adds crucial meaning: it explains that 'coord_sys_name' is 'The name of the coordinate system to use' and that the component parameters are 'String expression for the x/y/z-component of the vector field.' The example further clarifies how these expressions relate to coordinate system variables. This fully compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Creates a vector field in the specified coordinate system.' This is a specific verb+resource combination that tells the agent exactly what the tool does. However, it doesn't explicitly differentiate from sibling tools like 'create_matrix' or 'create_custom_metric' beyond the obvious difference in resource type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides implied usage guidance through the example, showing that a coordinate system must be created first and demonstrating the relationship between coordinate system variables and vector components. However, it doesn't explicitly state when to use this tool versus alternatives like 'create_matrix' or when vector fields are appropriate versus other mathematical constructs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

differentiate_expressionA

Differentiates an expression with respect to a variable using SymPy's diff function.

Args:
    expr_key: The key of the expression (previously introduced) to differentiate.
    var_name: The name of the variable to differentiate with respect to.
    order: The order of differentiation (default is 1 for first derivative).

Example:
    # Introduce a variable
    intro("x", [Assumption.REAL], [])

    # Create an expression to differentiate: x^3
    expr_key = introduce_expression("x**3")

    # First derivative
    first_deriv = differentiate_expression(expr_key, "x")
    # Returns 3x²

    # Second derivative
    second_deriv = differentiate_expression(expr_key, "x", 2)
    # Returns 6x

Returns:
    A key for the differentiated expression.
ParametersJSON Schema
NameRequiredDescriptionDefault
expr_keyYes
orderNo
var_nameYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explains that the tool returns 'A key for the differentiated expression,' indicating it's a read operation that doesn't modify state, and mentions it uses SymPy's diff function, which implies mathematical computation. However, it lacks details on error handling, performance, or prerequisites like requiring expressions to be introduced first, which the example hints at but doesn't state explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded: it starts with a clear purpose statement, followed by parameter explanations, an example with multiple use cases, and a returns section. Every sentence adds value, such as the example illustrating first and second derivatives, making it efficient and well-structured without unnecessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a mathematical differentiation tool with no annotations and no output schema, the description is mostly complete. It explains the tool's purpose, parameters, and provides an example with return values. However, it could improve by explicitly stating prerequisites (e.g., expressions must be introduced first) or error conditions, which are hinted at but not fully detailed, leaving minor gaps in context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning beyond the schema by explaining each parameter: expr_key is 'The key of the expression (previously introduced) to differentiate,' var_name is 'The name of the variable to differentiate with respect to,' and order is 'The order of differentiation (default is 1 for first derivative).' This clarifies the purpose and usage of all three parameters, though it doesn't cover constraints like valid variable names or order ranges.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Differentiates an expression with respect to a variable using SymPy's diff function.' It specifies the verb ('differentiates'), the resource ('an expression'), and the method ('using SymPy's diff function'), which distinguishes it from sibling tools like integrate_expression or simplify_expression that perform other mathematical operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for usage through the example, showing how to use the tool in sequence with intro and introduce_expression. However, it does not explicitly state when to use this tool versus alternatives like calculate_gradient or dsolve_ode, which might be relevant for vector calculus or differential equations. The guidance is implied but not comprehensive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsolve_odeA

Solves an ordinary differential equation using SymPy's dsolve function.

Args:
    expr_key: The key of the expression (previously introduced) containing the differential equation.
    func_name: The name of the function (previously introduced) to solve for.
    hint: Optional solving method from ODEHint enum. If None, SymPy will try to determine the best method.

Example:
    # First introduce a variable and a function
    intro("x", [Assumption.REAL], [])
    introduce_function("f")

    # Create a second-order ODE: f''(x) + 9*f(x) = 0
    expr_key = introduce_expression("Derivative(f(x), x, x) + 9*f(x)")

    # Solve the ODE
    result = dsolve_ode(expr_key, "f")
    # Returns solution with sin(3*x) and cos(3*x) terms

Returns:
    A LaTeX string representing the solution. Returns an error message string if issues occur.
ParametersJSON Schema
NameRequiredDescriptionDefault
expr_keyYes
func_nameYes
hintNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool returns a LaTeX string or an error message, which is useful behavioral information. However, it doesn't mention potential limitations (e.g., computational complexity, unsolvable equations), side effects, or performance considerations that would be important for a mathematical solving tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, args, example, returns) and every sentence earns its place. The example is comprehensive but necessary to demonstrate the workflow. No redundant information is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of ODE solving (3 parameters, no output schema, no annotations), the description is mostly complete. It explains the purpose, parameters, provides a detailed example, and specifies the return format. However, it lacks information about error conditions beyond 'issues occur' and doesn't mention dependencies on other tools (intro, introduce_function, introduce_expression) in the main description text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains all three parameters: expr_key (key of expression with the ODE), func_name (function to solve for), and hint (optional solving method from ODEHint enum). The description adds meaning by clarifying that expr_key and func_name refer to 'previously introduced' entities and that hint can be None for automatic method selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'solves an ordinary differential equation using SymPy's dsolve function,' which is a specific verb+resource combination. It distinguishes itself from siblings like solve_algebraically, solve_linear_system, and pdsolve_pde by focusing specifically on ODE solving with SymPy's dsolve.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context through the example, showing prerequisite steps (intro, introduce_function, introduce_expression) and how to use the tool. However, it doesn't explicitly state when to use this versus alternatives like solve_algebraically or pdsolve_pde, nor does it mention any exclusions or edge cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrate_expressionA

Integrates an expression with respect to a variable using SymPy's integrate function.

Args:
    expr_key: The key of the expression (previously introduced) to integrate.
    var_name: The name of the variable to integrate with respect to.
    lower_bound: Optional lower bound for definite integration.
    upper_bound: Optional upper bound for definite integration.

Example:
    # Introduce a variable
    intro("x", [Assumption.REAL], [])

    # Create an expression to integrate: x^2
    expr_key = introduce_expression("x**2")

    # Indefinite integration
    indefinite_result = integrate_expression(expr_key, "x")
    # Returns x³/3

    # Definite integration from 0 to 1
    definite_result = integrate_expression(expr_key, "x", "0", "1")
    # Returns 1/3

Returns:
    A key for the integrated expression.
ParametersJSON Schema
NameRequiredDescriptionDefault
expr_keyYes
lower_boundNo
upper_boundNo
var_nameYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the tool uses SymPy's integrate function and returns a key for the integrated expression, which adds behavioral context. However, it lacks details on error handling, performance, or side effects (e.g., whether it modifies state). The example helps but does not fully compensate for the absence of annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded, starting with a clear purpose statement, followed by parameter explanations, an example, and return information. Every sentence earns its place by adding value, with no redundant or wasted text, making it efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (mathematical integration tool with 4 parameters, no annotations, and no output schema), the description is fairly complete. It explains the purpose, parameters, provides an example, and states the return value. However, it could improve by detailing error cases or integration constraints, but the example and parameter explanations cover most essential aspects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning by explaining each parameter: expr_key is 'the key of the expression (previously introduced) to integrate,' var_name is 'the name of the variable to integrate with respect to,' and lower_bound/upper_bound are for 'definite integration.' This clarifies semantics beyond the schema's basic types, though it could provide more detail on format (e.g., string representations).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'integrates an expression with respect to a variable using SymPy's integrate function,' which is a specific verb+resource combination. It distinguishes itself from sibling tools like differentiate_expression (which performs differentiation) and other mathematical operations in the sibling list, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for usage through the example, showing how to use it for indefinite and definite integration. However, it does not explicitly state when to use this tool versus alternatives (e.g., differentiate_expression for derivatives), nor does it mention prerequisites like needing to introduce variables or expressions first, though the example implies this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

introC

Introduces a sympy variable with specified assumptions and stores it.

Takes a variable name and a list of positive and negative assumptions.

ParametersJSON Schema
NameRequiredDescriptionDefault
neg_assumptionsYes
pos_assumptionsYes
var_nameYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions 'stores it,' implying state mutation, but doesn't disclose behavioral traits like persistence scope, side effects, error conditions, or interaction with other tools (e.g., 'reset_state'). For a state-modifying tool, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized with two sentences. The first sentence front-loads the core purpose, and the second adds parameter context without redundancy. It avoids unnecessary words, though it could be slightly more structured (e.g., separating purpose from parameter details).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, 0% schema coverage, no output schema, and a state-modifying tool, the description is incomplete. It lacks details on behavioral traits, usage context, parameter constraints, and expected outcomes. For a tool that modifies sympy state, this leaves significant gaps for an AI agent to operate effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds some meaning by explaining that parameters include 'a variable name and a list of positive and negative assumptions,' which clarifies the purpose of 'pos_assumptions' and 'neg_assumptions.' However, it doesn't detail assumption semantics, constraints, or examples, leaving gaps in parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Introduces a sympy variable with specified assumptions and stores it.' This specifies the verb ('introduces'), resource ('sympy variable'), and action ('stores it'). However, it doesn't differentiate from sibling tools like 'intro_many' or 'introduce_expression', which appear related.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'intro_many' (likely for multiple variables) or 'introduce_expression', nor does it specify prerequisites or context for usage. The second sentence only restates parameter information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

introduce_expressionA

Parses a sympy expression string using available local variables and stores it. Assigns it to either a temporary name (expr_0, expr_1, etc.) or a user-specified global name.

Uses Sympy parse_expr to parse the expression string.

Applies default Sympy canonicalization rules unless canonicalize is False.

For equations (x^2 = 1) make the input string "Eq(x^2, 1") not "x^2 == 1"

Examples:

    {expr_str: "Eq(x^2 + y^2, 1)"}
    {expr_str: "Matrix(((25, 15, -5), (15, 18, 0), (-5, 0, 11)))"}
    {expr_str: "pi+e", "expr_var_name": "z"}
ParametersJSON Schema
NameRequiredDescriptionDefault
canonicalizeNo
expr_strYes
expr_var_nameNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and does well by disclosing key behaviors: uses Sympy parse_expr, applies canonicalization rules by default, stores expressions with temporary or user-specified names, and provides critical formatting guidance for equations. It doesn't mention error handling, performance, or state persistence details, but covers essential operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded with the core purpose in the first sentence. The examples are relevant but slightly lengthy; every sentence earns its place by clarifying behavior or parameters. Minor trimming of example formatting could improve efficiency, but overall it's well-structured and avoids redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (expression parsing/storage), no annotations, no output schema, and 0% schema coverage, the description is quite complete. It covers purpose, usage, parameters, and key behaviors. It doesn't describe the return value (stored expression reference) or error cases, which would be helpful given the lack of output schema, but provides sufficient context for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate and does so excellently. It explains all three parameters: 'expr_str' (the expression string to parse, with formatting examples), 'expr_var_name' (optional user-specified name vs. automatic temporary names), and 'canonicalize' (default Sympy canonicalization behavior). The examples directly illustrate parameter usage, adding substantial value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Parses a sympy expression string using available local variables and stores it. Assigns it to either a temporary name (expr_0, expr_1, etc.) or a user-specified global name.' This specifies the verb (parses and stores), resource (sympy expression string), and distinguishes it from sibling tools like 'simplify_expression' or 'differentiate_expression' by focusing on introduction/storage rather than manipulation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: for parsing and storing sympy expressions, with examples showing equation formatting ('Eq(x^2, 1)' not 'x^2 == 1'). However, it doesn't explicitly state when NOT to use it or name specific alternatives among the many sibling tools (e.g., vs. 'create_matrix' or 'introduce_function'), which prevents a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

introduce_functionB

Introduces a SymPy function variable and stores it.

Takes a function name and creates a SymPy Function object for use in defining differential equations.

Example:
    {func_name: "f"} will create the function f(x), f(t), etc. that can be used in expressions

Returns:
    The name of the created function.
ParametersJSON Schema
NameRequiredDescriptionDefault
func_nameYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool 'stores' the function (implying state mutation) and returns the function name, but lacks details on permissions, error conditions, or side effects. The example adds some behavioral context, but key aspects like persistence scope or limitations are missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded, with the core purpose stated first, followed by usage context, an example, and return information. Each sentence adds value, though the structure could be slightly more streamlined (e.g., merging the first two sentences).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and a single parameter with 0% schema coverage, the description is moderately complete. It covers the basic purpose, parameter usage, and return value, but lacks details on error handling, state management, or integration with sibling tools, leaving gaps for a mutation tool in a mathematical context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage (no parameter descriptions), but the tool description compensates well. It explains the 'func_name' parameter's purpose ('Takes a function name and creates a SymPy Function object') and provides an example ('{func_name: "f"} will create the function f(x), f(t), etc.'), adding meaningful semantics beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Introduces a SymPy function variable and stores it' and 'creates a SymPy Function object for use in defining differential equations.' It specifies the verb ('introduces', 'creates') and resource ('SymPy function variable/object'), though it doesn't explicitly differentiate from sibling tools like 'introduce_expression' or 'intro_many'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides minimal usage guidance, mentioning it's 'for use in defining differential equations' but doesn't specify when to use this tool versus alternatives like 'introduce_expression' or 'intro_many'. No explicit when-not-to-use or prerequisite information is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

intro_manyA

Introduces multiple sympy variables with specified assumptions and stores them.

Takes a list of VariableDefinition objects for the 'variables' parameter.
Each object in the list specifies:
- var_name: The name of the variable (string).
- pos_assumptions: A list of positive assumption strings (e.g., ["real", "positive"]).
- neg_assumptions: A list of negative assumption strings (e.g., ["complex"]).

The JSON payload for the 'variables' argument should be a direct list of these objects, for example:
```json
[
    {
        "var_name": "x",
        "pos_assumptions": ["real", "positive"],
        "neg_assumptions": ["complex"]
    },
    {
        "var_name": "y",
        "pos_assumptions": [],
        "neg_assumptions": ["commutative"]
    }
]
```

The assumptions must be consistent, so a real number is not allowed to be non-commutative.

Prefer this over intro() for multiple variables because it's more efficient.
ParametersJSON Schema
NameRequiredDescriptionDefault
variablesYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behaviors: the tool creates and stores variables, requires consistent assumptions, and provides a detailed JSON payload example. However, it doesn't mention error handling, side effects, or what 'stores them' means in practice (e.g., where variables are stored, persistence). The description adds substantial value but leaves some behavioral aspects implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and appropriately sized. It starts with a clear purpose statement, then details the parameter structure with a helpful example, adds a constraint note, and ends with usage guidance. Every sentence adds value, and there's no redundancy or fluff. The formatting with code blocks enhances readability without wasting space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (1 parameter but with nested objects), no annotations, and no output schema, the description does an excellent job covering most aspects. It explains the tool's purpose, parameter semantics, usage guidelines, and behavioral context. However, it doesn't describe the return value or what happens after variables are stored (e.g., are they available globally?), leaving a minor gap in completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must fully compensate. It does this excellently: it explains the 'variables' parameter as a list of VariableDefinition objects, details each object's structure (var_name, pos_assumptions, neg_assumptions), provides a comprehensive JSON example, and adds semantic constraints ('assumptions must be consistent'). This goes far beyond what the bare schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Introduces multiple sympy variables with specified assumptions and stores them.' It uses specific verbs ('introduces', 'stores'), identifies the resource ('sympy variables'), and distinguishes from its sibling 'intro' by emphasizing efficiency for multiple variables. This is a complete and precise purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Prefer this over intro() for multiple variables because it's more efficient.' It directly compares to the sibling tool 'intro' and gives a clear condition for when to use this tool (multiple variables) versus the alternative. This is optimal guidance for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

matrix_determinantA

Calculates the determinant of a matrix using SymPy's det method.

Args:
    matrix_key: The key of the matrix to calculate the determinant for.

Example:
    # Create a matrix
    matrix_key = create_matrix([[1, 2], [3, 4]])

    # Calculate its determinant
    det_key = matrix_determinant(matrix_key)
    # Results in -2

Returns:
    A key for the determinant expression.
ParametersJSON Schema
NameRequiredDescriptionDefault
matrix_keyYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the core behavior (calculating determinant using SymPy), includes an example with expected output, and specifies the return type ('A key for the determinant expression'). It could improve by mentioning potential errors (e.g., for non-square matrices) or performance considerations, but covers the essential operation well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, followed by clear sections for Args, Example, and Returns. Each sentence adds value: the first states the action and method, the Args defines the parameter, the Example demonstrates usage with concrete output, and the Returns specifies the result type. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 1 parameter with 0% schema coverage and no output schema, the description provides good context: it explains the parameter, shows an example with output, and describes the return value. For a mathematical operation tool, this is largely complete, though it could note dependencies (e.g., requires a square matrix) or link to sibling tools for related operations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clearly explains that 'matrix_key' is 'The key of the matrix to calculate the determinant for', adding meaning beyond the schema's generic 'Matrix Key' title. The example further illustrates how to obtain and use this key, though it does not detail key format or validation rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('calculates the determinant of a matrix') and resource ('matrix'), distinguishing it from sibling tools like matrix_eigenvalues or matrix_inverse. It explicitly mentions using SymPy's det method, providing technical specificity beyond a generic definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes an example showing usage after creating a matrix with create_matrix, implying a prerequisite workflow. However, it lacks explicit guidance on when to use this tool versus alternatives like matrix_eigenvalues or matrix_inverse, and does not mention any exclusions or specific contexts for application.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

matrix_eigenvaluesB

Calculates the eigenvalues of a matrix using SymPy's eigenvals method.

Args:
    matrix_key: The key of the matrix to calculate eigenvalues for.

Example:
    # Create a matrix
    matrix_key = create_matrix([[1, 2], [2, 1]])

    # Calculate its eigenvalues
    evals_key = matrix_eigenvalues(matrix_key)

Returns:
    A key for the eigenvalues expression (usually a dictionary mapping eigenvalues to their multiplicities).
ParametersJSON Schema
NameRequiredDescriptionDefault
matrix_keyYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions using SymPy's eigenvals method and describes the return format, which adds some behavioral context. However, it lacks details on error conditions (e.g., non-square matrices), computational complexity, or side effects. For a mathematical computation tool with zero annotation coverage, this is insufficient disclosure of behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded with the core functionality. It uses sections (Args, Example, Returns) for structure, making it easy to parse. The example is helpful but slightly verbose; overall, most sentences earn their place, though the Returns section could be more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (mathematical computation), no annotations, no output schema, and low schema coverage, the description is partially complete. It covers the basic operation and return format but lacks error handling, limitations, or integration with sibling tools. The example helps, but more context on usage in the broader tool ecosystem would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema, which has 0% description coverage. It explains that matrix_key refers to 'the key of the matrix to calculate eigenvalues for' and provides an example showing how to obtain it via create_matrix. This clarifies the parameter's purpose and usage context, compensating well for the schema's lack of documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool calculates eigenvalues of a matrix using SymPy's eigenvals method, which is a specific verb+resource combination. It distinguishes from some siblings like matrix_determinant or matrix_inverse, though not explicitly from matrix_eigenvectors which is closely related. The purpose is well-defined but could be more precise about differentiation from eigenvectors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It mentions a sibling tool create_matrix in an example, but does not explain when to choose eigenvalues over eigenvectors, determinants, or other matrix operations. There are no explicit when/when-not instructions or prerequisites stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

matrix_eigenvectorsA

Calculates the eigenvectors of a matrix using SymPy's eigenvects method.

Args:
    matrix_key: The key of the matrix to calculate eigenvectors for.

Example:
    # Create a matrix
    matrix_key = create_matrix([[1, 2], [2, 1]])

    # Calculate its eigenvectors
    evecs_key = matrix_eigenvectors(matrix_key)

Returns:
    A key for the eigenvectors expression (usually a list of tuples (eigenvalue, multiplicity, [eigenvectors])).
ParametersJSON Schema
NameRequiredDescriptionDefault
matrix_keyYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the mathematical operation and return format, but doesn't mention computational complexity, error conditions, or limitations (e.g., matrix size restrictions, numerical stability). It provides basic behavioral information but could be more comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Args, Example, Returns) and front-loaded purpose statement. The example is helpful but slightly verbose; every sentence earns its place though some could be more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description does a good job explaining the tool's purpose, parameter, usage example, and return format. It could benefit from more behavioral details (like computational characteristics), but provides sufficient context for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must compensate. It clearly explains that matrix_key refers to 'The key of the matrix to calculate eigenvectors for' and provides an example showing how to obtain this key. This adds meaningful context beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('calculates the eigenvectors of a matrix') and the implementation method ('using SymPy's eigenvects method'), which distinguishes it from sibling tools like matrix_eigenvalues or matrix_determinant. It provides a complete verb+resource+method specification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the example showing it requires a matrix created via create_matrix, but doesn't explicitly state when to use this tool versus alternatives like matrix_eigenvalues. It provides some context but lacks explicit guidance on tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

matrix_inverseA

Calculates the inverse of a matrix using SymPy's inv method.

Args:
    matrix_key: The key of the matrix to invert.

Example:
    # Create a matrix
    matrix_key = create_matrix([[1, 2], [3, 4]])

    # Calculate its inverse
    inv_key = matrix_inverse(matrix_key)

Returns:
    A key for the inverted matrix.
ParametersJSON Schema
NameRequiredDescriptionDefault
matrix_keyYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the computational method (SymPy's inv) and the return format (a key for the inverted matrix), which is helpful. However, it doesn't mention potential limitations like non-invertible matrices, numerical stability, or performance characteristics that would be valuable for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is perfectly structured with purpose statement, parameter documentation, example, and return explanation - all in minimal space. Every sentence earns its place, and the information is front-loaded with the core functionality stated first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mathematical operation tool with no annotations or output schema, the description provides good coverage of what the tool does, how to use it, and what it returns. The example is particularly helpful. It could be more complete by mentioning mathematical constraints (e.g., square matrices only, determinant non-zero), but overall it's quite adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must compensate. It provides a clear explanation of the single parameter ('matrix_key: The key of the matrix to invert') and shows its usage in the example. This adds substantial meaning beyond the bare schema, though it doesn't detail what constitutes a valid matrix_key format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Calculates the inverse of a matrix') and the method used ('using SymPy's inv method'), which distinguishes it from sibling tools like matrix_determinant or matrix_eigenvalues. It provides a precise verb+resource combination that leaves no ambiguity about the tool's function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes an example showing prerequisite usage (create_matrix first) and the expected workflow, providing clear context for when to use this tool. However, it doesn't explicitly state when NOT to use it or mention alternatives like solving linear systems directly, which would elevate it to a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pdsolve_pdeA

Solves a partial differential equation using SymPy's pdsolve function.

Args:
    expr_key: The key of the expression (previously introduced) containing the PDE.
             If the expression is not an equation (Eq), it will be interpreted as
             PDE = 0.
    func_name: The name of the function (previously introduced) to solve for.
               This should be a function of multiple variables.

Example:
    # First introduce variables and a function
    intro("x", [Assumption.REAL], [])
    intro("y", [Assumption.REAL], [])
    introduce_function("f")

    # Create a PDE: 1 + 2*(ux/u) + 3*(uy/u) = 0
    expr_key = introduce_expression(
        "Eq(1 + 2*Derivative(f(x, y), x)/f(x, y) + 3*Derivative(f(x, y), y)/f(x, y), 0)"
    )

    # Solve the PDE
    result = pdsolve_pde(expr_key, "f")
    # Returns solution with exponential terms and arbitrary function

Returns:
    A LaTeX string representing the solution. Returns an error message string if issues occur.
ParametersJSON Schema
NameRequiredDescriptionDefault
expr_keyYes
func_nameYes
hintNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses key behaviors: it interprets non-equation expressions as PDE=0, returns a LaTeX string or error message, and requires previously introduced expressions/functions. However, it lacks details on performance, limitations, or side effects (e.g., state changes).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (description, args, example, returns), but includes verbose example code that could be condensed. Most sentences earn their place by clarifying usage, though some details (like the full example) are lengthy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (PDE solving with 3 parameters, no annotations, no output schema), the description is mostly complete. It covers purpose, parameters, example usage, and return format. However, it omits the optional hint parameter and lacks error handling details, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema, which has 0% description coverage. It explains expr_key as 'the key of the expression (previously introduced) containing the PDE' with interpretation rules, and func_name as 'the name of the function (previously introduced) to solve for.' The optional hint parameter is not mentioned, leaving a minor gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Solves a partial differential equation using SymPy's pdsolve function.' It specifies the verb ('solves'), resource ('partial differential equation'), and implementation method ('SymPy's pdsolve function'), distinguishing it from sibling tools like dsolve_ode (for ODEs) or solve_algebraically (for algebraic equations).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use this tool through the example, showing it requires pre-introduced variables and functions via sibling tools (intro, introduce_function, introduce_expression). However, it does not explicitly state when not to use it or name alternatives (e.g., dsolve_ode for ODEs), though the context implies differentiation from other solving tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

quantity_simplify_unitsA

Simplifies a quantity with units using sympy's built-in simplify method for Quantity objects.

Args:
    expr_key: The key of the expression (previously introduced) to simplify.
    unit_system: Optional unit system (from UnitSystem enum). Not used with direct simplify method.

The following units are available by default:
    SI base units: meter, second, kilogram, ampere, kelvin, mole, candela
    Length: kilometer, millimeter
    Mass: gram
    Energy: joule
    Force: newton
    Pressure: pascal
    Power: watt
    Electric: coulomb, volt, ohm, farad, henry
    Constants: speed_of_light, gravitational_constant, planck

Example:
    # Simplify force expressed in base units
    expr_key = introduce_expression("kilogram*meter/second**2")
    result = quantity_simplify_units(expr_key)
    # Returns newton (as N = kg·m/s²)

    # Simplify a complex expression with mixed units
    expr_key = introduce_expression("joule/(kilogram*meter**2/second**2)")
    result = quantity_simplify_units(expr_key)
    # Returns a dimensionless quantity (1)

    # Simplify electrical power expression
    expr_key = introduce_expression("volt*ampere")
    result = quantity_simplify_units(expr_key)
    # Returns watt

Example with Speed of Light:
    # Introduce the speed of light
    c_key = introduce_expression("speed_of_light")

    # Convert to kilometers per hour
    km_per_hour_key = convert_to_units(c_key, ["kilometer", "1/hour"])

    # Simplify to get the numerical value
    simplified_key = quantity_simplify_units(km_per_hour_key)

    # Print the result
    print_latex_expression(simplified_key)
    # Shows the numeric value of speed of light in km/h

Returns:
    A key for the simplified expression, or an error message.
ParametersJSON Schema
NameRequiredDescriptionDefault
expr_keyYes
unit_systemNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains that the tool uses sympy's simplify method for Quantity objects and returns a key for the simplified expression or an error message, which covers basic behavior. However, it lacks details on potential side effects, error conditions, or performance considerations, leaving gaps in transparency for a tool that modifies expressions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose but includes extensive examples and a list of available units that may be redundant or overly detailed. While informative, the length could be streamlined by focusing more on essential guidance rather than exhaustive unit listings, affecting efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of unit simplification, no annotations, and no output schema, the description provides a solid foundation with purpose, parameters, examples, and return information. It covers key aspects like method (sympy), parameter semantics, and usage scenarios, though it could benefit from more explicit behavioral details or error handling to be fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema, which has 0% description coverage. It explains 'expr_key' as 'the key of the expression (previously introduced) to simplify' and notes that 'unit_system' is 'optional' and 'not used with direct simplify method,' clarifying parameter roles. The examples further illustrate usage, compensating well for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'simplifies a quantity with units using sympy's built-in simplify method for Quantity objects,' specifying the action (simplify), resource (quantity with units), and method (sympy). It distinguishes from sibling tools like 'simplify_expression' by focusing on unit simplification rather than general expression simplification. However, it doesn't explicitly contrast with 'convert_to_units,' which handles unit conversion rather than simplification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through examples, such as simplifying force expressed in base units or electrical power expressions, but lacks explicit guidance on when to use this tool versus alternatives like 'simplify_expression' or 'convert_to_units.' It mentions that 'unit_system' is 'not used with direct simplify method,' which provides some context but doesn't fully define when this tool is appropriate compared to siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reset_stateA

Resets the state of the SymPy MCP server.

Clears all stored variables, functions, expressions, metrics, tensors,
coordinate systems, and resets the expression counter.

Then reinitializes unit variables.

Runs after all tool calls for a given computation are done to reset the state for the next computation.

Returns:
    A message confirming the reset.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and does well by detailing what gets destroyed (clears all stored items) and what gets reinitialized (unit variables). It also mentions the return value (confirmation message). However, it doesn't address potential side effects like whether this affects ongoing computations or requires specific permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Perfectly structured with zero waste: first sentence states purpose, second enumerates what gets cleared, third specifies reinitialization, fourth provides usage timing, fifth describes return value. Every sentence adds essential information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given this is a state management tool with 0 parameters and no output schema, the description provides complete context: what it does, what gets affected, when to use it, and what it returns. No annotations exist to supplement this information, yet the description stands adequately on its own.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters with 100% schema description coverage, so the baseline is 4. The description appropriately doesn't discuss parameters since none exist, focusing instead on the tool's behavior and usage context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Resets the state') and the resource ('SymPy MCP server'), listing exactly what gets cleared (variables, functions, expressions, metrics, tensors, coordinate systems, expression counter) and what gets reinitialized (unit variables). It distinguishes itself from all sibling tools which perform mathematical operations rather than system maintenance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool: 'Runs after all tool calls for a given computation are done to reset the state for the next computation.' This provides clear context about its timing and purpose relative to other tools, with no ambiguity about when it should be invoked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_predefined_metricsC

Searches for predefined metrics in einsteinpy.symbolic.predefined.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

TDQS

C2.4/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden but offers minimal behavioral insight. It doesn't disclose whether this is a read-only operation, what the search returns (e.g., list of metric names, objects), any constraints like rate limits, or how results are formatted, making it inadequate for a tool with no annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence with no wasted words, making it appropriately sized and front-loaded. It efficiently states the tool's purpose without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (a search tool with no annotations, 0% schema coverage, and no output schema), the description is incomplete. It lacks details on behavior, parameters, return values, and differentiation from siblings, leaving significant gaps for an AI agent to understand and use the tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description provides no information about the single 'query' parameter. It doesn't explain what the query should contain (e.g., metric names, keywords), its format, or examples, failing to compensate for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the action ('Searches for') and target resource ('predefined metrics in einsteinpy.symbolic.predefined'), which is clear but vague. It doesn't specify what 'predefined metrics' are or how they differ from sibling tools like 'create_predefined_metric' or 'create_custom_metric', missing sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. With siblings like 'create_predefined_metric' and 'create_custom_metric', there's no indication of whether this tool is for discovery, lookup, or selection, leaving usage context implied at best.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplify_expressionA

Simplifies a mathematical expression using SymPy's simplify function.

Args:
    expr_key: The key of the expression (previously introduced) to simplify.

Example:
    # Introduce variables
    intro("x", [Assumption.REAL], [])
    intro("y", [Assumption.REAL], [])

    # Create an expression to simplify: sin(x)^2 + cos(x)^2
    expr_key = introduce_expression("sin(x)**2 + cos(x)**2")

    # Simplify the expression
    simplified = simplify_expression(expr_key)
    # Returns 1

Returns:
    A key for the simplified expression.
ParametersJSON Schema
NameRequiredDescriptionDefault
expr_keyYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool uses SymPy's simplify function, which implies mathematical simplification behavior, and the example shows it returns a simplified result (e.g., 'sin(x)^2 + cos(x)^2' simplifies to 1). However, it doesn't cover aspects like error handling (e.g., invalid expr_key), performance (e.g., complexity for large expressions), or side effects (e.g., whether it modifies state). The description adds some behavioral context but leaves gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded: the first sentence states the purpose clearly, followed by structured sections for Args, Example, and Returns. Each sentence earns its place by providing essential information without redundancy. The example is concise and illustrative, and the overall structure enhances readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (mathematical simplification with one parameter), no annotations, and no output schema, the description is partially complete. It covers the purpose, parameter semantics, and provides an example, but lacks details on return values beyond a brief note ('Returns: A key for the simplified expression'), and doesn't address error cases or integration with sibling tools. For a tool in a math-focused server with many siblings, more contextual guidance would be beneficial.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema, which has 0% description coverage. It explains that 'expr_key' is 'The key of the expression (previously introduced) to simplify,' clarifying its role and dependency on prior steps (e.g., using 'introduce_expression'). This compensates well for the schema's lack of documentation, though it doesn't detail format constraints or validation rules for the key.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Simplifies a mathematical expression using SymPy's simplify function.' It specifies the verb ('simplifies') and resource ('mathematical expression'), and mentions the underlying library (SymPy). However, it doesn't explicitly differentiate from sibling tools like 'quantity_simplify_units' or 'substitute_expression', which may also involve simplification or expression manipulation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the example, showing that it operates on an expression key introduced via 'introduce_expression'. It doesn't provide explicit when-to-use guidance vs. alternatives (e.g., 'quantity_simplify_units' for unit simplification or 'substitute_expression' for substitution), nor does it mention prerequisites like needing to introduce variables first. The example suggests context but lacks clear exclusions or comparisons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

solve_algebraicallyA

Solves an equation (expression = 0) algebraically for a given variable.

Args:
    expr_key: The key of the expression (previously introduced) to be solved.
    solve_for_var_name: The name of the variable (previously introduced) to solve for.
    domain: The domain to solve in: Domain.COMPLEX, Domain.REAL, Domain.INTEGERS, or Domain.NATURALS. Defaults to Domain.COMPLEX.

Returns:
    A LaTeX string representing the set of solutions. Returns an error message string if issues occur.
ParametersJSON Schema
NameRequiredDescriptionDefault
domainNocomplex
expr_keyYes
solve_for_var_nameYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses key behavioral traits: it solves equations algebraically, returns LaTeX strings or error messages, and has a default domain. However, it doesn't mention computational complexity, limitations on equation types, whether it modifies state, or error handling specifics beyond 'issues occur'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, Args, Returns) and front-loaded with the core functionality. Every sentence adds value, though the 'Returns' section could be slightly more concise by combining the two sentences about LaTeX strings and errors.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (3 parameters, algebraic solving), no annotations, and no output schema, the description is reasonably complete. It covers purpose, parameters, return format, and default behavior. However, it lacks details on error conditions, performance characteristics, or examples that would make it fully comprehensive for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds substantial meaning beyond the input schema, which has 0% description coverage. It explains that expr_key refers to 'previously introduced' expressions, solve_for_var_name is for 'previously introduced' variables, and domain has four specific options with their meanings and a default. This fully compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verbs ('solves an equation algebraically') and resources ('expression = 0', 'for a given variable'). It distinguishes itself from sibling tools like solve_linear_system and solve_nonlinear_system by focusing on algebraic solutions of single equations rather than systems of equations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by specifying it solves 'expression = 0' and mentions previously introduced expressions/variables, suggesting it works within a session context. However, it doesn't explicitly state when to use this tool versus alternatives like solve_linear_system or differentiate_expression, nor does it provide exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

solve_linear_systemA

Solves a system of linear equations using SymPy's linsolve.

Args:
    expr_keys: The keys of the expressions (previously introduced) forming the system.
    var_names: The names of the variables to solve for.
    domain: The domain to solve in (Domain.COMPLEX, Domain.REAL, etc.). Defaults to Domain.COMPLEX.

Returns:
    A LaTeX string representing the solution set. Returns an error message string if issues occur.
ParametersJSON Schema
NameRequiredDescriptionDefault
domainNocomplex
expr_keysYes
var_namesYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and does well by disclosing key behavioral traits: it specifies the solving method (SymPy's linsolve), mentions dependencies on 'previously introduced' expressions, describes the return format (LaTeX string or error message), and notes the default domain. However, it doesn't cover potential limitations like unsolvable systems or performance aspects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Args, Returns) and front-loaded purpose. Every sentence earns its place, though it could be slightly more concise by integrating the default domain note into the domain parameter description rather than as a separate sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of solving linear systems, no annotations, and no output schema, the description is quite complete: it explains purpose, parameters, return values, and dependencies. The main gap is lack of explicit error conditions or limitations, but it covers the essential context for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by explaining all three parameters: expr_keys are 'keys of the expressions (previously introduced) forming the system', var_names are 'names of the variables to solve for', and domain is 'the domain to solve in' with examples and default. This adds crucial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Solves a system of linear equations') using a specific method ('using SymPy's linsolve'), which distinguishes it from sibling tools like solve_nonlinear_system. It provides the verb+resource combination needed for precise understanding.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the mention of 'previously introduced' expressions, suggesting a workflow with introduce_expression, but doesn't explicitly state when to use this tool versus alternatives like solve_algebraically or solve_nonlinear_system. No explicit exclusions or comparisons are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

solve_nonlinear_systemA

Solves a system of nonlinear equations using SymPy's nonlinsolve.

Args:
    expr_keys: The keys of the expressions (previously introduced) forming the system.
    var_names: The names of the variables to solve for.
    domain: The domain to solve in (Domain.COMPLEX, Domain.REAL, etc.). Defaults to Domain.COMPLEX.

Returns:
    A LaTeX string representing the solution set. Returns an error message string if issues occur.
ParametersJSON Schema
NameRequiredDescriptionDefault
domainNocomplex
expr_keysYes
var_namesYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and discloses key behavioral traits: it uses SymPy's nonlinsolve, returns a LaTeX string or error message, and mentions dependencies on 'previously introduced' expressions. However, it doesn't cover rate limits, computational complexity, or specific error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by structured Args and Returns sections. Every sentence adds value: the first states the action and method, and the subsequent lines explain parameters and output without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, 0% schema coverage, and no output schema, the description is fairly complete: it explains purpose, parameters, and return behavior. However, it could improve by detailing error cases or computational limits, and it doesn't fully address sibling tool differentiation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning for all parameters: expr_keys are 'keys of the expressions (previously introduced)', var_names are 'names of the variables to solve for', and domain is 'the domain to solve in' with examples. This clarifies semantics beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Solves a system of nonlinear equations'), the method ('using SymPy's nonlinsolve'), and the resource ('expressions previously introduced'). It distinguishes from siblings like solve_linear_system and solve_algebraically by specifying nonlinear equations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for nonlinear equations but doesn't explicitly state when to use this tool versus alternatives like solve_linear_system or solve_algebraically. It mentions 'previously introduced' expressions, suggesting a prerequisite, but lacks clear exclusions or comparative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

substitute_expressionA

Substitutes a variable in an expression with another expression using SymPy's subs method.

Args:
    expr_key: The key of the expression to perform substitution on.
    var_name: The name of the variable to substitute.
    replacement_expr_key: The key of the expression to substitute in place of the variable.

Example:
    # Create variables x and y
    intro("x", [], [])
    intro("y", [], [])

    # Create expressions
    expr1 = introduce_expression("x**2 + y**2")
    expr2 = introduce_expression("sin(x)")

    # Substitute y with sin(x) in x^2 + y^2
    result = substitute_expression(expr1, "y", expr2)
    # Results in x^2 + sin^2(x)

Returns:
    A key for the resulting expression after substitution.
ParametersJSON Schema
NameRequiredDescriptionDefault
expr_keyYes
replacement_expr_keyYes
var_nameYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It explains the mathematical behavior (substitution using SymPy) and shows the transformation logic in the example. However, it doesn't disclose important behavioral traits like whether this modifies the original expression or creates a new one, error conditions, or performance characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, Args, Example, Returns) and every sentence adds value. It could be slightly more concise by integrating the example more tightly, but overall it's efficiently organized with zero wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mathematical operation tool with no annotations and no output schema, the description provides good coverage: clear purpose, parameter explanations, usage example, and return value explanation. It could be more complete by describing error cases or the state management context (keys reference previously created expressions), but it's substantially adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by clearly explaining all three parameters in the Args section: 'expr_key' (key of expression to perform substitution on), 'var_name' (name of variable to substitute), and 'replacement_expr_key' (key of expression to substitute in place). The example further illustrates their usage and relationships.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Substitutes a variable in an expression with another expression') and the implementation method ('using SymPy's subs method'). It distinguishes this tool from siblings like 'differentiate_expression' or 'simplify_expression' by focusing specifically on variable substitution rather than other mathematical operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context through the example showing when to use this tool (after creating variables and expressions with 'intro' and 'introduce_expression'). However, it doesn't explicitly state when NOT to use this tool or mention alternatives among the sibling tools, which prevents a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 32 tool updatesv1.0.0
    • First observedcalculate_curl
    • First observedcalculate_divergence
    • First observedcalculate_gradient
    • First observedcalculate_tensor
    • First observedconvert_to_units
    • First observedcreate_coordinate_system
    • First observedcreate_custom_metric
    • First observedcreate_matrix
    • First observedcreate_predefined_metric
    • First observedcreate_vector_field
    • First observeddifferentiate_expression
    • First observeddsolve_ode
    • First observedintegrate_expression
    • First observedintro
    • First observedintro_many
    • First observedintroduce_expression
    • First observedintroduce_function
    • First observedmatrix_determinant
    • First observedmatrix_eigenvalues
    • First observedmatrix_eigenvectors
    • First observedmatrix_inverse
    • First observedpdsolve_pde
    • First observedprint_latex_expression
    • First observedprint_latex_tensor
    • First observedquantity_simplify_units
    • First observedreset_state
    • First observedsearch_predefined_metrics
    • First observedsimplify_expression
    • First observedsolve_algebraically
    • First observedsolve_linear_system
    • First observedsolve_nonlinear_system
    • First observedsubstitute_expression

TDQS

B3.4/5.0

Scored across 32 tools

Disambiguation4/5

Most tools have distinct purposes, such as calculate_curl for vector calculus, differentiate_expression for derivatives, and solve_algebraically for equation solving. However, there is some overlap between intro and intro_many (both introduce variables) and between the various solve_* tools (linear, nonlinear, algebraic), which could cause minor confusion. Descriptions help clarify, but the boundaries are not perfectly sharp.

Naming Consistency4/5

The tool names follow a consistent verb_noun pattern throughout, such as calculate_curl, create_coordinate_system, and simplify_expression. Minor deviations include intro and intro_many (abbreviated verbs) and reset_state (verb_noun but less descriptive), but overall the naming is predictable and readable.

Tool Count3/5

With 32 tools, the count feels heavy for a symbolic algebra server, bordering on excessive. While the domain is broad (covering calculus, linear algebra, differential equations, units, etc.), the set includes many specialized tools that might be overwhelming. A more streamlined set of 15-25 tools could improve coherence without losing functionality.

Completeness5/5

The tool surface is highly complete for symbolic algebra, covering core operations like differentiation, integration, equation solving (algebraic, linear, nonlinear, ODEs, PDEs), matrix operations (determinant, eigenvalues, inverse), vector calculus (gradient, divergence, curl), unit conversion, and expression manipulation (simplify, substitute). There are no obvious gaps; agents can perform complex workflows from variable introduction to solution output.

Maintenance

ActivityInactive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides a suite of deterministic math tools powered by SymPy to handle algebra, calculus, linear algebra, and statistics via the Model Context Protocol. It enables smaller language models to delegate complex computations to a verified symbolic backend for accurate and reliable results.
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    A secure mathematical computation sandbox that enables LLMs to perform symbolic math operations like algebra, calculus, and equation solving via SymPy. It features low-latency execution through pre-warmed process pools and provides standardized JSON outputs for reliable agent integration.
    1
    2
    MIT