关于 Cruncher Mcp
Cruncher 是面向 AI 客户端及 MCP 实现学习者的轻量科学计算器 MCP 服务。它提供数学、统计和单位换算工具,并利用 Node.js 功能实现输入验证与计算超时控制。
主要功能
- 01基本运算与表达式求值
- 02三角函数、对数与数论
- 03统计和百分比计算
- 0480 多种单位换算
- 05科学常数与可选记忆功能
- 06分级工具集与计算超时控制
适用场景
- 01求解公式和科学表达式
- 02用统计方法分析数值数据
- 03转换支持的计量单位
- 04了解纯 JavaScript 的 MCP 实现
MCP 相关
通过 stdio 向 MCP 客户端提供独立的计算工具。它使用原生 JavaScript 实现 MCP 与 JSON-RPC 处理,不依赖官方 SDK。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @slbdn/cruncher-mcpCRUNCHER_TOOL_SETTool exposure tier: 'minimal' (5 tools), 'standard' (34 tools, default), or 'full' (43 tools)CRUNCHER_TIMEOUTWorker thread timeout in milliseconds for heavy calculations (default: 3000, range: 100-60000)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
34收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| a | number | 是 | |
| b | number | 是 |
详细介绍
Cruncher:科学计算器 MCP 服务
这是一款功能强大的科学计算器,可供你的 AI 助手使用,并以 Model Context Protocol (MCP) 服务的形式构建。Cruncher 让兼容的 AI 客户端(如 Claude Desktop)通过简单、安全且标准化的接口,执行复杂的数学计算、处理内存、进行统计分析并访问科学常数。
🌟 纯粹承诺(零依赖)
Cruncher 是一款极具教育意义、极其轻量的工具。它无需引入任何庞大的外部库(没有 mathjs、没有 zod、没有 @modelcontextprotocol/sdk),就能实现强大的功能。一切都由 Node.js 原生能力处理:
- 安全的表达式求值:Cruncher 不依赖
mathjs或危险的eval(),而是使用new Function(),并通过严格的白名单 Regex 进行保护,确保只有数字和数学运算符能够通过。 - 输入验证:它没有使用 Zod 等庞大的架构库,而是通过自定义的递归验证函数,直接依据 JSON Schemas 严格验证 AI 输入。
- 超时保护:它不依赖复杂的进程管理器,而是利用 Node.js 的
worker_threads启动计算。如果 AI 请求计算一个包含数百万次循环的阶乘,主线程会在严格的超时期限(默认 3 秒)后轻松终止工作线程。此超时可通过CRUNCHER_TIMEOUT环境变量(以毫秒为单位)配置,确保服务即使在计算负载繁重时也能保持响应。 - 浮点精度:它不使用
decimal.js,而是通过底层的动态整数缩放逻辑解决经典的 JS 数学错误(0.1 + 0.2 = 0.30000000000000004)。
📚 MCP 教育指南
对于希望深入了解 Model Context Protocol (MCP) 的开发者来说,本项目是绝佳的学习资源。由于它刻意避免使用官方的 @modelcontextprotocol/sdk,因此 MCP 协议、JSON-RPC 消息处理、输入验证和错误格式化的完整实现,都以纯 JavaScript 呈现。
阅读 cruncher.js,可以清晰、直观地了解 MCP 服务如何通过 stdio 通信、解析传入的请求(initialize、tools/list、tools/call),并向 AI 客户端响应,从而揭开 SDK 通常隐藏起来的“魔法”。
什么是 Model Context Protocol?
Model Context Protocol (MCP) 是一项开放标准,让 AI 应用能够安全地连接外部数据源和工具。你可以把它看作面向 AI 的通用 API。将 Cruncher 实现为 MCP 服务后,任何理解 MCP 的 AI 都能立即获得强大的内置计算器能力,无需定制集成。
✨ 功能
Cruncher 提供一套全面的计算器功能,完全从零构建,不依赖繁重的依赖项:
- 稳健的架构:
- 零依赖:完全依赖 Node.js 标准库。
- 严格的输入验证:自定义架构验证器可防止 AI 幻觉和无效数据。
- 无限循环防护:使用 Node.js
worker_threads,并设置严格的 3 秒超时,防止复杂计算导致服务冻结。 - 精准的十进制运算:采用整数缩放方法,避免经典的 JS 浮点数错误(例如
0.1 + 0.2 === 0.3)。
- 分级工具开放:提供三个级别(
minimal、默认的standard和full),以优化上下文令牌用量。 - 基本算术:加法、减法、乘法、除法、取模。
- 表达式求值:安全计算完整的纯文本数学表达式(例如
(5 + 3) * 10 / 2)。 - 幂和根:乘方(
a^b)、平方根。 - 数论:阶乘(n!)。
- 三角函数:正弦、余弦、正切、反正弦(
asin)、反余弦(acos)和反正切(atan)(支持角度和弧度)。 - 对数:常用对数和自然对数(ln)。
- 统计函数:对数字数组求和、平均值、中位数、最小值、最大值、范围、计数、方差和标准差。
- 百分比函数:求百分比、百分比变化和反向百分比计算。
- 单位转换:涵盖 8 个类别的 80 多种转换(长度、重量、温度、面积、体积、时间、速度、digital_storage)。
- 便捷函数:绝对值。
- 常量:轻松获取数学常量(
pi、e、tau、phi、sqrt2、euler_mascheroni)、物理常量(c、g、G、h、k、R)和化学常量(NA、e_charge、m_e、m_p)。 - 存储器函数:
M+、M-、MR(存储器读取)和MC(存储器清除)——仅限 full 级别。
🚀 安装与使用
只需几分钟,即可让 Cruncher 在 Claude Desktop 中运行。
第 1 步:准备工作
确保系统已安装 Node.js(版本 18.0.0 或更新版本)。可从 nodejs.org 下载。
第 1 步:通过 npm 快速开始
推荐:通过 npm 安装并直接使用:
npx @slbdn/cruncher-mcp
这会自动下载并运行最新版本。
第 2 步:配置 Claude Desktop
推荐:使用 npm 包以自动更新:
{
"mcpServers": {
"cruncher": {
"command": "npx",
"args": ["-y", "@slbdn/cruncher-mcp"]
}
}
}
第 3 步:手动下载文件(替代方式)
如果你更倾向于手动下载文件:
-
直接从 GitHub 下载
cruncher.js文件。 -
将其放在固定位置(例如
C:\mcp-servers\cruncher.js或/home/user/mcp-servers/cruncher.js)。 -
找到 Claude Desktop 配置文件:
- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
-
添加 MCP 服务配置,并将其指向已下载的文件:
{ "mcpServers": { "cruncher": { "command": "node", "args": ["C:/Users/YOUR_USERNAME/mcp-servers/cruncher.js"], "env": { "CRUNCHER_TOOL_SET": "standard" } } } }**macOS/Linux 用户须知:**请使用 POSIX 风格的路径,例如
"/home/YOUR_USERNAME/mcp-servers/cruncher.js"。确保node可执行文件位于系统 PATH 中。
第 4 步:开始计算!
- 保存配置文件,并完全退出 Claude Desktop 应用。
- 重启 Claude Desktop。它会自动连接到 Cruncher 服务。
- 开始提问!
OpenWebUI(原 Ollama WebUI)
OpenWebUI 原生支持连接 stdio MCP 服务。
选项 A:使用 npm 包
- 前往 管理面板 > 设置 > 工具 > MCP 服务。
- 点击 添加服务。
- 将其命名为“Cruncher”,选择 Command 并输入
npx,将 Args 设置为@slbdn/cruncher-mcp。
选项 B:使用已下载的文件
- 前往 管理面板 > 设置 > 工具 > MCP 服务。
- 点击 添加服务。
- 将其命名为“Cruncher”,选择 stdio,使用
node作为命令,并将/path/to/cruncher.js作为参数。
Cursor IDE
你可以让 Cursor 内置的 AI 执行数学运算并计算哈希值。
选项 A:使用 npm 包
- 打开 Cursor 设置(齿轮图标)> 功能 > MCP 服务。
- 点击 + 添加新的 MCP 服务。
- 将类型设为
command,名称设为cruncher,命令设为npx @slbdn/cruncher-mcp。
选项 B:使用已下载的文件
- 打开 Cursor 设置(齿轮图标)> 功能 > MCP 服务。
- 点击 + 添加新的 MCP 服务。
- 将类型设为
command,名称设为cruncher,命令设为node /path/to/cruncher.js。
Cline(VS Code 扩展)
如果你在 VS Code 中使用 Cline 进行 Agent 式编码,请打开 MCP 配置文件(cline_mcp_settings.json)并添加:
选项 A:使用 npm 包
{
"mcpServers": {
"cruncher": {
"command": "npx",
"args": ["-y", "@slbdn/cruncher-mcp"]
}
}
}
选项 B:使用已下载的文件
{
"mcpServers": {
"cruncher": {
"command": "node",
"args": ["/path/to/cruncher.js"],
"env": {
"CRUNCHER_TOOL_SET": "standard"
}
}
}
}
Goose(终端 Agent)
Goose 是一款轻量级、基于终端的 AI 助手,全面支持 MCP。
选项 A:使用 npm 包
- 编辑
~/.goose/config.yaml(或本地项目配置)。 - 添加新的服务条目:
mcpServers:
cruncher:
command: npx
args:
- -y
- "@slbdn/cruncher-mcp"
选项 B:使用已下载的文件
- 编辑
~/.goose/config.yaml(或本地项目配置)。 - 添加新的服务条目:
mcpServers:
cruncher:
command: node
args:
- "/path/to/cruncher.js"
env:
CRUNCHER_TOOL_SET: "standard"
- 重启 Goose。现在,你可以直接让 Goose 执行
evaluate_expression或median等计算。
Zed Editor(AI 面板)
Zed 内置的 AI 面板支持 MCP 连接。
选项 A:使用 npm 包
- 打开 设置 → AI → MCP 服务。
- 点击 添加服务并填写:
- 名称:
cruncher - 命令:
npx - Args:
@slbdn/cruncher-mcp
- 名称:
- 保存。现在,Zed AI 可以调用 Cruncher 进行精确的算术运算和统计。
选项 B:使用已下载的文件
- 打开 设置 → AI → MCP 服务。
- 点击 添加服务并填写:
- 名称:
cruncher - 命令:
node - Args:
/absolute/path/to/cruncher.js - Env(可选):
CRUNCHER_TOOL_SET=standard
- 名称:
- 保存。现在,Zed AI 可以调用 Cruncher 进行精确的算术运算和统计。
LM Studio(本地大模型 + MCP)
LM Studio 完全离线运行大模型,现在也内置了 MCP 客户端。
选项 A:使用 npm 包
- 在 LM Studio 中打开 设置 → MCP。
- 点击 添加服务并提供:
- 可执行文件:
npx - 参数:
@slbdn/cruncher-mcp
- 可执行文件:
- 确认。你的私有模型现在可以将数学运算交给 Cruncher 处理,全程不会产生任何网络流量。
选项 B:使用已下载的文件
- 在 LM Studio 中打开 设置 → MCP。
- 点击 添加服务并提供:
- 可执行文件:
node - 参数:
/absolute/path/to/cruncher.js - 环境变量(可选):
CRUNCHER_TOOL_SET=standard
- 可执行文件:
- 确认。你的私有模型(例如 Llama 3、DeepSeek-V2)现在可以将数学运算交给 Cruncher 处理,全程不会产生任何网络流量。
LibreChat 配置
如果你使用 LibreChat,可以将以下配置添加到 librechat.yaml 文件中:
选项 A:使用 npm 软件包
cruncher:
type: stdio
command: npx
args:
- -y
- "@slbdn/cruncher-mcp"
选项 B:使用已下载的文件
cruncher:
type: stdio
command: node
args:
- "/opt/mcp/cruncher.js"
env:
CRUNCHER_TIMEOUT: "5000"
Claude 示例问题
“正弦值为 0.5 的角度是多少度?”
“计算这些数字的平均值、中位数和极差:[15, 22, 8, 41, 19, 30]”
“2 的 10 次方是多少?”
“[10, 12, 8, 14, 6] 的标准差是多少?”
“240 的 15% 是多少?”
“一只股票的价格从 $50 涨到 $75。百分比变化是多少?”
“测试成绩 [85, 92, 78, 90, 88] 的方差是多少?”
“计算 [3, 7, 2, 9, 1] 中数值的极差”
“计算表达式:sin(pi/4) + sqrt(16) + log10(100)”
“10 的阶乘是多少?”
“17 除以 5 的余数是多少?”
完整版示例(使用 CRUNCHER_TOOL_SET=full):
“将 99 存入内存,加上 5,然后取回总数。”
“[10, 20, 30, 40, 50] 的第 75 百分位数是多少?”
“将 11010 从二进制转换为十进制。”
“批量计算:144 的平方根,加上 10,然后平方。”
“将三角函数切换到弧度模式。”
“清除结果缓存并显示缓存统计信息。”
“取回内存中的内容,然后减去 15 并存储结果。”
“[23, 45, 12, 67, 89, 34, 56, 78, 90, 11] 的第 95 百分位数是多少?”
“将 0xFF 从十六进制转换为二进制。”
📋 可用工具
Cruncher 将其函数作为独立的 MCP 工具提供。以下是完整列表:
| 工具名称 | 描述 | 参数 |
|---|---|---|
| 基本算术 | ||
evaluate_expression | 计算纯文本数学表达式(例如 (5 + 3) * 10 / 2)。 | expression(字符串) |
add | 将两个数字相加(a + b)。 | a(数字),b(数字) |
subtract | 用第一个数字减去第二个数字(a - b)。 | a(数字),b(数字) |
multiply | 将两个数字相乘(a * b)。 | a(数字),b(数字) |
divide | 用第一个数字除以第二个数字(a / b)。 | a(数字),b(数字) |
modulo | 计算余数(a mod b)。 | a(数字),b(数字) |
| 幂与根 | ||
power | 计算 a 的 b 次幂(a^b)。 | base(数字),exponent(数字) |
sqrt | 计算一个值的平方根。 | value(数字) |
| 数论 | ||
factorial | 计算非负整数的阶乘(n!)。 | n(数字,非负整数) |
| 单位换算 | ||
convert_unit | 在常见单位之间进行换算。8 个类别,80 多种单位。 | value(数字),category(字符串),from(字符串),to(字符串) |
| 进制转换(完整版) | ||
convert_base | 在 2、8、10、16 进制之间进行转换。 | value(字符串),from_base(2、8、10、16),to_base(2、8、10、16) |
| 三角函数 | ||
sine | 计算角度的正弦值。 | angle(数字),unit(度/弧度,可选) |
cosine | 计算角度的余弦值。 | angle(数字),unit(度/弧度,可选) |
tangent | 计算角度的正切值。 | angle(数字),unit(度/弧度,可选) |
asin | 计算一个值的反正弦(arcsine)。返回角度。 | value(数字),unit(度/弧度,可选) |
acos | 计算一个值的反余弦(arccosine)。返回角度。 | value(数字),unit(度/弧度,可选) |
atan | 计算一个值的反正切(arctangent)。返回角度。 | value(数字),unit(度/弧度,可选) |
| 对数 | ||
logarithm | 计算一个值的常用对数(以 10 为底)。 | value(数字) |
natural_log | 计算一个值的自然对数(以 e 为底)。 | value(数字) |
| 统计函数 | ||
sum | 计算数字数组的总和。 | numbers(数字数组) |
avg | 计算数字数组的平均值。 | numbers(数字数组) |
median | 计算数字数组的中位数。 | numbers(数字数组) |
min | 查找数字数组中的最小值。 | numbers(数字数组) |
max | 查找数字数组中的最大值。 | numbers(数字数组) |
count | 统计数组中的元素数量。 | numbers(数字数组) |
range | 计算数组的极差(最大值 - 最小值)。 | numbers(数字数组) |
percentile | 计算给定百分位数(0-100)对应的值。完整版本。 | numbers(数字数组),percentile(数字,0-100) |
variance | 计算数组的方差。可计算样本方差(n-1)或总体方差(n)。 | numbers(数字数组),population(布尔值,可选) |
std_dev | 计算标准差。可计算样本标准差(n-1)或总体标准差(n)。 | numbers(数字数组),population(布尔值,可选) |
percentage_of | X 是 Y 的百分之几?例如,200 的 15% = 30。 | percent(数字),total(数字) |
percentage_change | 计算从 A 到 B 的百分比变化。例如,50→80 = 60%。 | from(数字),to(数字) |
percentage_reverse | X 是哪个数的 Y%?例如,30 是 200 的 15%。 | value(数字),percent(数字) |
| 其他 | ||
absolute | 计算一个数字的绝对值。 | value(数字) |
| 常量 | ||
get_constant | 返回数学、物理或化学常量的值。 | name("pi"、"e"、"tau"、"phi"、"sqrt2"、"euler_mascheroni"、"c"、"g"、"G"、"h"、"k"、"R"、"NA"、"e_charge"、"m_e"、"m_p") |
| 记忆功能(完整版本) | ||
memory_clear | 清除计算器记忆(MC)。 | (无参数) |
memory_recall | 调取记忆中存储的值(MR)。 | (无参数) |
memory_add | 将一个值加到当前记忆中(M+)。 | value(数字) |
memory_subtract | 从当前记忆中减去一个值(M-)。 | value(数字) |
| 角度模式(标准版) | ||
set_angle_mode | 设置全局角度模式(默认:度)。 | unit("degrees" 或 "radians") |
get_angle_mode | 获取当前角度模式。 | (无参数) |
| 管理工具(完整版本) | ||
batch | 按顺序执行多个工具调用。 | operations(包含 {tool, arguments} 的数组) |
cache_clear | 清除计算缓存。 | (无参数) |
cache_info | 显示缓存统计信息。 | (无参数) |
⚙️ 配置
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
CRUNCHER_TIMEOUT | 3000 | 工作线程执行超时时间(ms)。范围为 100-60000 |
CRUNCHER_TOOL_SET | standard | 控制工具的开放范围:minimal(5 个)、standard(34 个,默认值)、full(43 个) |
工具层级 - 完整参考
Cruncher 通过环境变量 CRUNCHER_TOOL_SET 提供 3 个层级。每个层级都严格包含前一个层级的全部内容。
层级概览
| 层级 | 工具数 | 使用场景 |
|---|---|---|
| Minimal(5 个) | 仅核心算术 | 轻量级计算器、简单数学 Agent |
| Standard(34 个 - 默认) | 所有 Minimal 工具 + 三角函数、统计、常量、单位转换 | 通用 AI 助手数学计算 |
| Full(43 个) | 所有 Standard 工具 + 内存、批处理、缓存、进制转换、高级统计 | 高级用户、多步骤工作流 |
Minimal 层级(5 个工具)
所有工具都在工作线程中运行,并受超时保护。
| # | 工具 | 描述 |
|---|---|---|
| 1 | evaluate_expression | 计算数学表达式字符串 |
| 2 | add | 加法(a + b) |
| 3 | subtract | 减法(a - b) |
| 4 | multiply | 乘法(a × b) |
| 5 | divide | 除法(a ÷ b) |
Standard 层级(34 个工具 - 包含全部 5 个 Minimal 工具)
| # | 工具 | 类别 |
|---|---|---|
| 6 | sqrt | 平方根 |
| 7 | power | 求幂(a^b) |
| 8 | absolute | 绝对值 |
| 9 | modulo | 余数(a mod b) |
| 10 | factorial | 阶乘(n!) |
| 11 | logarithm | 常用对数 |
| 12 | natural_log | 自然对数(ln) |
| 13 | get_constant | 获取物理/数学常量 |
| 14-16 | sine、cosine、tangent | 三角函数 |
| 17-19 | asin、acos、atan | 反三角函数 |
| 20 | set_angle_mode | 切换角度/弧度(全局) |
| 21 | get_angle_mode | 查看当前角度模式 |
| 22-25 | sum、avg、min、max | 基本统计 |
| 26 | count | 统计元素数量 |
| 27 | variance | 方差(样本或总体) |
| 28 | std_dev | 标准差(样本或总体) |
| 29 | percentage_of | 求 Y 的 X% |
| 30 | percentage_change | 求 A→B 的百分比变化 |
| 31 | percentage_reverse | X 是多少的 Y%? |
| 32 | median | 中位数 |
| 33 | range | 极差(最大值 - 最小值) |
| 34 | convert_unit | 80 多种单位转换,8 个类别 |
Full 层级(43 个工具 - 包含全部 34 个 Standard 工具)
| # | 工具 | 类别 |
|---|---|---|
| 35 | percentile | 第 N 百分位数对应的值 |
| 36 | convert_base | 2/8/10/16 进制转换 |
| 37 | memory_add | 加到累计总值 |
| 38 | memory_subtract | 从累计总值中减去 |
| 39 | memory_recall | 获取当前内存值 |
| 40 | memory_clear | 将内存重置为零 |
| 41 | batch | 一次调用最多执行 50 个操作 |
| 42 | cache_clear | 清除结果缓存 |
| 43 | cache_info | 显示缓存统计信息 |
工具名称模糊匹配
如果 LLM 调用了不存在的工具,Cruncher 会使用 Levenshtein 距离查找最接近的匹配项并给出建议:
| 拼写错误 | 建议 | 匹配类型 |
|---|---|---|
fact | factorial | 前缀匹配 |
fac | factorial | 前缀匹配 |
sinn | sine | 1 个字符拼写错误 |
squrt | sqrt | 字符顺序颠倒 |
adddd | add | 多余字母 |
divid | divide | 缺少后缀 |
totally_wrong | (无) | 差异过大 - 无建议 |
响应格式:
{
"error": {
"code": -32601,
"message": "Tool 'fact' not found. Did you mean 'factorial'?"
}
}
Extended evaluate_expression Built-ins
除基本算术运算外,evaluate_expression 还原生支持以下函数:
| 函数 | 说明 | 示例 | 结果 |
|---|---|---|---|
sin(x) | 正弦(弧度制,在表达式中始终使用弧度) | sin(pi / 2) | 1 |
cos(x) | 余弦(弧度制,在表达式中始终使用弧度) | cos(pi) | -1 |
tan(x) | 正切(弧度制) | tan(pi / 4) | ~1 |
asin(x) | 反正弦(结果为弧度) | asin(1) | π/2 |
acos(x) | 反余弦(结果为弧度) | acos(0) | π/2 |
atan(x) | 反正切(结果为弧度) | atan(1) | π/4 |
sqrt(x) | 平方根 | sqrt(144) | 12 |
log10(x) | 以 10 为底的对数 | log10(1000) | 3 |
ln(x) | 自然对数(以 e 为底) | ln(e) | 1 |
log(x, b) | 任意底数的对数 | log(8, 2) | 3 |
abs(x) | 绝对值 | abs(-5) | 5 |
round(x) | 四舍五入到最接近的整数 | round(3.7) | 4 |
floor(x) | 向下取整 | floor(3.9) | 3 |
ceil(x) | 向上取整 | ceil(3.1) | 4 |
min(a,b,...) | 最小值 | min(3, 1, 4) | 1 |
max(a,b,...) | 最大值 | max(3, 1, 4) | 4 |
可自由组合:sin(pi/6) + sqrt(16) + log10(100) = 6.5
改进的错误消息
现在,定义域错误会指出问题所在:
sqrt(-1)→ "检查以下情况:sqrt(负数)、log(负数/零)、asin/acos 超出 [-1,1]"1/0→ "检查是否除以零或溢出"asin(5)→ "asin/acos 超出 [-1,1]"
表达式中的常量
现在可以在 evaluate_expression 中直接使用数学和物理常量名称:
| 常量 | 说明 | 值 |
|---|---|---|
pi | π(圆周率) | 3.14159... |
e | 欧拉数 | 2.71828... |
tau | τ = 2π | 6.28318... |
phi | 黄金比例(φ) | 1.61803... |
sqrt2 | √2 | 1.41421... |
euler_mascheroni | 欧拉-马歇罗尼常数(γ) | 0.57721... |
c | 光速(m/s) | 299792458 |
g | 重力加速度(m/s2) | 9.80665 |
G | 万有引力常数 | 6.6743e-11 |
h | 普朗克常数(J·s) | 6.62607015e-34 |
k | 玻尔兹曼常数(J/K) | 1.380649e-23 |
R | 理想气体常数(J/mol·K) | 8.314462618 |
NA | 阿伏伽德罗常数(1/mol) | 6.02214076e23 |
e_charge | 元电荷(C) | 1.602176634e-19 |
m_e | 电子质量(kg) | 9.1093837015e-31 |
m_p | 质子质量(kg) | 1.67262192369e-27 |
示例:
2 * pi * 5 → 31.4159...
phi ^ 2 → 2.61803...
G * 1e11 → 6.6743
sqrt2 * sqrt2 → 2
e * e → 7.38906...
c * 2 → 599584916
规则:
- 使用显式运算符:
2 * pi有效,2pi无效(不支持隐式乘法) - 常量可与科学计数法共存:
1e6和e * 2均可正确计算 - 优先匹配最长的常量名称:
euler_mascheroni不会被解析成299792458uler_mascheroni
分层工具暴露
CRUNCHER_TOOL_SET 环境变量可让你仅暴露实际需要的工具,从而优化上下文令牌用量:
| 层级 | 工具数 | 令牌预算 | 使用场景 |
|---|---|---|---|
minimal | 5 | ~160 tokens | 基本算术。所有复杂数学运算均通过 evaluate_expression 完成 |
standard | 34 | ~1,150 tokens | 算术、三角函数、统计、百分比、常量、单位换算(默认) |
full | 43 | ~1,500 tokens | 标准工具 + 内存、进制转换、百分位数、批处理、缓存 |
注意:即使在 minimal 模式下,evaluate_expression 也能处理复杂数学运算;只是 sin、sqrt 等单独工具不会注册为独立的 MCP 工具调用。这样可节省高达 90% 的上下文令牌。
MCP 配置示例(claude_desktop_config.json):
{
"mcpServers": {
"cruncher-minimal": {
"command": "node",
"args": ["/path/to/cruncher.js"],
"env": { "CRUNCHER_TOOL_SET": "minimal" }
}
}
}
⛏️ 工作原理(面向开发者)
Cruncher 是一个纯 Node.js JavaScript 应用,通过**标准输入/输出(stdio)**进行通信。这使它成为轻量、可移植且安全的 MCP 服务。一次工具调用的完整流程如下:
- 初始化:启动时,服务会监听 MCP 客户端发送的
initialize请求,并返回其功能和版本信息(v1.2.31)。 - 工具发现:客户端发送
tools/list请求,服务会返回所有可用计算器工具的完整列表及其inputSchema,该架构定义了必需参数及其类型。 - 输入验证:执行任何工具之前,服务都会根据工具的
inputSchema运行自定义的递归validateArguments函数。这可确保必填字段齐全、类型正确(数字、字符串、数组)、枚举值有效,并且符合最小值/最大值约束——全程无需任何外部库。 - Worker 线程执行:验证通过后,工具调用会交由隔离的 Node.js
worker_thread处理。这能全面保护主线程(及其stdio通信),避免因长时间运行或无限计算而受阻。 - 超时保护:可配置的计时器(
CRUNCHER_TIMEOUT,默认值为 3000ms)会监控 Worker。如果 Worker 耗时过长,主线程会通过worker.terminate()强制终止它,并向 AI 客户端返回-32000错误。 - 安全计算与结果:Worker 使用
safeMath(整数缩放)执行处理函数,以确保小数运算安全;随后将结果发回主线程,由主线程格式化最终的 JSON-RPC 2.0 响应并写入stdout。
🤝 贡献
欢迎贡献!如果你想添加新函数、修复 Bug 或改进文档,欢迎提交 issue 或拉取请求。
📜 许可证
本项目采用 MIT 许可证。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。