Skip to main content
Glama
sdiehl
by sdiehl

符号代数 MCP 服务器

Sympy-MCP 是一个模型上下文协议 (MCP) 服务器,允许 LLM 自主执行符号数学和计算机代数运算。它将 SymPy 核心功能中的众多工具开放给 MCP 客户端,用于操作数学表达式和方程式。

为什么?

语言模型在符号操作方面简直糟糕透顶。它们会幻化变量,制造随机常数,对术语进行置换,通常会造成混乱。但我们有专门为符号操作构建的计算机代数系统,因此我们可以使用工具调用来协调一系列转换,以便符号核完成所有繁重的工作。

虽然您当然可以让 LLM 生成 Mathematica 或 Python 代码,但如果您想将 LLM 用作代理或即时计算器,那么使用 MCP 服务器并直接公开符号工具会是一种更好的体验。

该服务器公开了一系列符号数学功能,包括代数方程求解、积分和微分、矢量微积分、广义相对论的张量微积分以及常微分方程和偏微分方程。

例如,你可以用自然语言要求它解决微分方程:

求解具有强迫项的阻尼谐振子:由微分方程描述的质量-弹簧-阻尼器系统,其中 m 为质量,c 为阻尼系数,k 为弹簧常数,F(t) 为外力。

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

或者涉及广义相对论:

使用反德西特时空的逆度量 $g^{\mu\nu}$ 计算里奇张量 $R_{\mu\nu}$ 的迹,以确定其常数标量曲率 $R$。

Related MCP server: ReasonForge

用法

你首先需要紫外线

  • 自制- brew install uv

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

然后您可以使用以下命令安装并运行服务器:

# 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

您现在应该可以在 Claude 桌面应用中看到服务器了。其他客户端请参见下文。

如果您想要一个完全独立的版本,只需一个命令即可运行,可以使用以下命令。请注意,这会运行来自 Github 的任意代码,因此请谨慎操作。

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

如果要做广义相对论计算,需要安装einsteinpy库。

uv sync --group relativity

可用工具

sympy-mcp 服务器为符号数学提供了以下工具:

工具

工具 ID

描述

变量引入

intro

引入具有指定假设的变量并存储它

多变量

intro_many

同时引入具有指定假设的多个变量

表达式解析器

introduce_expression

使用可用的局部变量解析表达式字符串并存储它

LaTeX 打印机

print_latex_expression

以 LaTeX 格式打印存储的表达式以及变量假设

代数求解器

solve_algebraically

在给定域内对给定变量进行代数求解方程

线性求解器

solve_linear_system

求解线性方程组

非线性求解器

solve_nonlinear_system

求解非线性方程组

函数变量

introduce_function

引入用于微分方程的函数变量

ODE 求解器

dsolve_ode

求解常微分方程

PDE 求解器

pdsolve_pde

求解偏微分方程

标准公制

create_predefined_metric

创建预定义的时空度量(例如史瓦西、克尔、闵可夫斯基)

指标搜索

search_predefined_metrics

搜索可用的预定义指标

张量计算器

calculate_tensor

根据度量计算张量(Ricci、Einstein、Weyl 张量)

自定义指标

create_custom_metric

根据提供的组件和符号创建自定义度量张量

张量 LaTeX

print_latex_tensor

以 LaTeX 格式打印存储的张量表达式

简化器

simplify_expression

使用 SymPy 的规范化函数简化数学表达式

替代

substitute_expression

用另一个表达式中的表达式替换变量

一体化

integrate_expression

对变量的表达式进行积分

差异化

differentiate_expression

对表达式进行关于变量的区分

坐标

create_coordinate_system

为矢量微积分运算创建 3D 坐标系

矢量场

create_vector_field

在指定的坐标系中创建一个矢量场

卷曲

calculate_curl

计算矢量场的旋度

分歧

calculate_divergence

计算矢量场的散度

坡度

calculate_gradient

计算标量场的梯度

单位换算器

convert_to_units

将数量转换为给定的目标单位

单位简化器

quantity_simplify_units

用单位简化数量

矩阵创造者

create_matrix

根据提供的数据创建 SymPy 矩阵

行列式

matrix_determinant

计算矩阵的行列式

矩阵逆

matrix_inverse

计算矩阵的逆

特征值

matrix_eigenvalues

计算矩阵的特征值

特征向量

matrix_eigenvectors

计算矩阵的特征向量

默认情况下,变量是预先设定好的(类似于 SymPy 中symbol()函数的工作原理)。除非另有说明,否则默认假设变量是复数域 $\mathbb{C}$ 上的复数、交换项。

财产

价值

commutative

真的

complex

真的

finite

真的

infinite

错误的

Claude 桌面设置

通常情况下, mcp install命令会自动将服务器添加到claude_desktop_config.json文件中。如果没有,您需要找到该配置文件并添加以下内容:

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

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

将以下内容添加到mcpServers对象,将/ABSOLUTE_PATH_TO_SYMPY_MCP/server.py替换为 sympy-mcp server.py文件的绝对路径。

{
  "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/mcp.json中,添加以下内容,其中ABSOLUTE_PATH_TO_SYMPY_MCP是 sympy-mcp server.py 文件的路径。

{
  "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 设置

VS Code 和 VS Code Insiders 现已支持代理模式下的 MCP。对于 VS Code,您可能需要在设置中启用Chat > Agent: Enable

  1. 一键设置:

在 VS Code 中安装

在 VS Code Insiders 中安装

或者手动将配置添加到您的settings.json (全局):

{
  "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. 单击服务器配置上方的“开始”,打开 Python 或数学文件,在聊天中切换到代理模式,然后尝试“integrate x^2”或“solve x^2 = 1”等命令来开始。

Cline 设置

要与Cline一起使用,您需要先使用“使用”部分中的命令手动运行 MCP 服务器。MCP 服务器运行后,打开 Cline 并选择顶部的“MCP 服务器”。

然后选择“远程服务器”并添加以下内容:

  • 服务器名称: sympy-mcp

  • 服务器网址: http://127.0.0.1:8081/sse 8081/sse

5ire 设置

另一个在后端支持多种模型(o3、o4-mini、DeepSeek-R1 等)的 MCP 客户端是 5ire。

要使用5ire进行设置,请打开 5ire 并转到工具 -> 新建并设置以下配置:

  • 工具密钥: sympy-mcp

  • 名称:SymPy MCP

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

/ABSOLUTE_PATH_TO/server.py替换为 sympy-mcp server.py 文件的实际路径。

在容器中运行

您可以在本地使用 Docker 构建并运行服务器:

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

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

或者,您可以从 GitHub Container Registry 中提取预先构建的图像:

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

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

要配置 Claude Desktop 来启动 Docker 容器,请编辑claude_desktop_config.json文件:

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

或者使用 GitHub 上预先构建的容器:

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

此配置告知 Claude Desktop 在需要时启动 Docker 容器。使用此配置之前,请确保已构建 Docker 镜像 ( docker build -t sympy-mcp . )。

如果您将 uv 命令更改为使用 docker run 命令,其他安装方法也可以适应 Docker。

示例交互 1:微分方程

以下是使用此 MCP 服务器与 AI 助手对话时工具调用工作原理的示例:

用户:求解具有强迫项的阻尼谐振子:由微分方程描述的质量-弹簧-阻尼器系统,其中 m 为质量,c 为阻尼系数,k 为弹簧常数,F(t) 为外力。

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

助手:(内部工具调用) intro_many引入变量:

{
  "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": []}
  ]
}

助手:(内部工具调用) introduce_function来定义 x(t):

{
  "func_name": "x"
}

助手:(内部工具调用) introduce_expression来创建微分方程:

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

助手:(内部工具调用) print_latex_expression很好地显示方程式:

{
  "expr_key": "expr_12"
}

结果:

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

助手:(内部工具调用) introduce_function来定义 F(t):

{
  "func_name": "F"
}

助手:(内部工具调用) dsolve_ode求解微分方程:

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

结果:

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

示例交互2:广义相对论

用户:使用反德西特时空的逆度量 $g^{\mu\nu}$ 计算 Ricci 张量 $R_{\mu\nu}$ 的迹,以确定其常数标量曲率 $R$。

助手:(内部工具调用) create_predefined_metric创建 Anti-de Sitter 指标:

{
  "metric_name": "AntiDeSitter"
}

助手:(内部工具调用) calculate_tensor计算 Ricci 张量:

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

助手:(内部工具调用) print_latex_tensor显示 Ricci 张量:

{
  "tensor_key": "riccitensor_metric_AntiDeSitter"
}

结果:

$$ \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] $$

助手:(内部工具调用) calculate_tensor计算 Ricci 标量:

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

助手:(内部工具调用) print_latex_tensor显示 Ricci 标量:

{
  "tensor_key": "ricciscalar_metric_AntiDeSitter"
}

结果:

$$ -12 $$

安全免责声明

该服务器在您的计算机上运行,并授予语言模型运行 Python 逻辑的权限。值得注意的是,它使用 Sympy 的parse_expr来解析数学表达式,而这在底层使用了eval ,实际上允许任意代码执行。运行该服务器意味着您信任 Claude 生成的代码。在 Docker 镜像中运行会稍微安全一些,但在运行之前检查代码仍然是个好主意。

执照

版权所有 2025 Stephen Diehl。

本项目遵循 Apache 2.0 许可证。详情请参阅许可证文件。

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