@cyanheads/calculator-mcp-server 0.1.26 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/CLAUDE.md +2 -2
- package/README.md +1 -1
- package/dist/mcp-server/tools/definitions/calculate.tool.d.ts +9 -2
- package/dist/mcp-server/tools/definitions/calculate.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/calculate.tool.js +45 -12
- package/dist/mcp-server/tools/definitions/calculate.tool.js.map +1 -1
- package/dist/services/math/math-service.d.ts +18 -0
- package/dist/services/math/math-service.d.ts.map +1 -1
- package/dist/services/math/math-service.js +131 -13
- package/dist/services/math/math-service.js.map +1 -1
- package/package.json +1 -1
- package/server.json +3 -3
package/AGENTS.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Agent Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** calculator-mcp-server
|
|
4
|
-
**Version:** 0.
|
|
4
|
+
**Version:** 0.3.0
|
|
5
5
|
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.9.16`
|
|
6
6
|
**Engines:** Bun ≥1.3.0, Node ≥24.0.0
|
|
7
7
|
**MCP SDK:** `@modelcontextprotocol/sdk` 1.29.0
|
|
@@ -20,7 +20,7 @@ A publicly-hosted calculator MCP server that lets any LLM verify mathematical co
|
|
|
20
20
|
|
|
21
21
|
### Security Model
|
|
22
22
|
|
|
23
|
-
MathService wraps a **hardened math.js instance** — dangerous functions (`import`, `createUnit`, `evaluate`, `parse`, `compile`, `chain`, `config`, `resolve`, `reviver`, `parser`) are disabled in the expression scope. `simplify` and `derivative` are also disabled in expressions but called programmatically by the tool handler. Evaluation runs inside `vm.runInNewContext()` with a timeout. Input length is capped. Expression separators (semicolons and newlines) are rejected — single expression per call only. Variable scope accepts `z.record(z.number())` only with prototype-polluting keys blocked. Result types are validated (functions, parsers, and result sets rejected). Result size is capped via `CALC_MAX_RESULT_LENGTH`. The math.js `version` constant is redacted to prevent fingerprinting.
|
|
23
|
+
MathService wraps a **hardened math.js instance** — dangerous functions (`import`, `createUnit`, `evaluate`, `parse`, `compile`, `chain`, `config`, `resolve`, `reviver`, `parser`) are disabled in the expression scope. `simplify` and `derivative` are also disabled in expressions but called programmatically by the tool handler. Evaluation runs inside `vm.runInNewContext()` with a timeout. Input length is capped. Expression separators (semicolons and newlines) are rejected — single expression per call only (the separator scan is string-literal-aware so `;` inside `"..."` is not treated as a statement break). Variable scope accepts `z.record(z.number())` only with prototype-polluting keys blocked. Result types are validated (functions, parsers, and result sets rejected). `.toString()` / `.toLocaleString()` access on any value is rejected at parse time via an AST check — these method calls on function-valued identifiers would otherwise bypass the result-type guard by returning source as a plain string. Result size is capped via `CALC_MAX_RESULT_LENGTH`. The math.js `version` constant is redacted to prevent fingerprinting.
|
|
24
24
|
|
|
25
25
|
---
|
|
26
26
|
|
package/CLAUDE.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Agent Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** calculator-mcp-server
|
|
4
|
-
**Version:** 0.
|
|
4
|
+
**Version:** 0.3.0
|
|
5
5
|
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.9.16`
|
|
6
6
|
**Engines:** Bun ≥1.3.0, Node ≥24.0.0
|
|
7
7
|
**MCP SDK:** `@modelcontextprotocol/sdk` 1.29.0
|
|
@@ -20,7 +20,7 @@ A publicly-hosted calculator MCP server that lets any LLM verify mathematical co
|
|
|
20
20
|
|
|
21
21
|
### Security Model
|
|
22
22
|
|
|
23
|
-
MathService wraps a **hardened math.js instance** — dangerous functions (`import`, `createUnit`, `evaluate`, `parse`, `compile`, `chain`, `config`, `resolve`, `reviver`, `parser`) are disabled in the expression scope. `simplify` and `derivative` are also disabled in expressions but called programmatically by the tool handler. Evaluation runs inside `vm.runInNewContext()` with a timeout. Input length is capped. Expression separators (semicolons and newlines) are rejected — single expression per call only. Variable scope accepts `z.record(z.number())` only with prototype-polluting keys blocked. Result types are validated (functions, parsers, and result sets rejected). Result size is capped via `CALC_MAX_RESULT_LENGTH`. The math.js `version` constant is redacted to prevent fingerprinting.
|
|
23
|
+
MathService wraps a **hardened math.js instance** — dangerous functions (`import`, `createUnit`, `evaluate`, `parse`, `compile`, `chain`, `config`, `resolve`, `reviver`, `parser`) are disabled in the expression scope. `simplify` and `derivative` are also disabled in expressions but called programmatically by the tool handler. Evaluation runs inside `vm.runInNewContext()` with a timeout. Input length is capped. Expression separators (semicolons and newlines) are rejected — single expression per call only (the separator scan is string-literal-aware so `;` inside `"..."` is not treated as a statement break). Variable scope accepts `z.record(z.number())` only with prototype-polluting keys blocked. Result types are validated (functions, parsers, and result sets rejected). `.toString()` / `.toLocaleString()` access on any value is rejected at parse time via an AST check — these method calls on function-valued identifiers would otherwise bypass the result-type guard by returning source as a plain string. Result size is capped via `CALC_MAX_RESULT_LENGTH`. The math.js `version` constant is redacted to prevent fingerprinting.
|
|
24
24
|
|
|
25
25
|
---
|
|
26
26
|
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<div align="center">
|
|
9
9
|
|
|
10
|
-
[](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/calculator-mcp-server) [](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/calculator-mcp-server) [](https://www.typescriptlang.org/) [](https://bun.sh/)
|
|
11
11
|
|
|
12
12
|
</div>
|
|
13
13
|
|
|
@@ -19,6 +19,13 @@ export declare const calculateTool: import("@cyanheads/mcp-ts-core").ToolDefinit
|
|
|
19
19
|
result: z.ZodString;
|
|
20
20
|
resultType: z.ZodString;
|
|
21
21
|
expression: z.ZodString;
|
|
22
|
+
operation: z.ZodEnum<{
|
|
23
|
+
evaluate: "evaluate";
|
|
24
|
+
simplify: "simplify";
|
|
25
|
+
derivative: "derivative";
|
|
26
|
+
}>;
|
|
27
|
+
scopeVars: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
28
|
+
precisionUsed: z.ZodOptional<z.ZodNumber>;
|
|
22
29
|
}, z.core.$strip>, readonly [{
|
|
23
30
|
readonly reason: "empty_expression";
|
|
24
31
|
readonly code: JsonRpcErrorCode.ValidationError;
|
|
@@ -42,8 +49,8 @@ export declare const calculateTool: import("@cyanheads/mcp-ts-core").ToolDefinit
|
|
|
42
49
|
}, {
|
|
43
50
|
readonly reason: "disallowed_result_type";
|
|
44
51
|
readonly code: JsonRpcErrorCode.ValidationError;
|
|
45
|
-
readonly when: "Result
|
|
46
|
-
readonly recovery: "Rewrite the expression to produce a value (number, matrix, unit) instead of a function or
|
|
52
|
+
readonly when: "Result is a function, parser, or multi-expression ResultSet, or the expression converts a function to a string (e.g. `cos.toString()`) — security guard.";
|
|
53
|
+
readonly recovery: "Rewrite the expression to produce a value (number, matrix, unit) instead of a function or its source.";
|
|
47
54
|
}, {
|
|
48
55
|
readonly reason: "result_too_large";
|
|
49
56
|
readonly code: JsonRpcErrorCode.ValidationError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculate.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/calculate.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"calculate.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/calculate.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2MxB,CAAC"}
|
|
@@ -17,7 +17,7 @@ export const calculateTool = tool('calculate', {
|
|
|
17
17
|
expression: z
|
|
18
18
|
.string()
|
|
19
19
|
.min(1)
|
|
20
|
-
.describe(`One mathematical expression per call — neither \`;\` nor newlines separate statements. Inside matrices, \`;\` separates rows (e.g. \`[1, 2; 3, 4]\`). Supports arithmetic (+, -, *, /, ^, %), functions (sin, cos, sqrt, log, abs, round, etc.), constants (pi, e, phi, i), matrices, units (5 kg to lbs), and variables (when scope is provided)
|
|
20
|
+
.describe(`One mathematical expression per call — neither \`;\` nor newlines separate statements. Inside matrices, \`;\` separates rows (e.g. \`[1, 2; 3, 4]\`). Supports arithmetic (+, -, *, /, ^, %), functions (sin, cos, sqrt, log, abs, round, etc.), constants (pi, e, phi, i), matrices, units (5 kg to lbs), and variables (when scope is provided). Standard notation \`ln\` and \`arc*\` (e.g. \`arcsin\`, \`arctan\`) is accepted alongside the math.js names \`log\` and \`asin\`/\`atan\`.`),
|
|
21
21
|
operation: z
|
|
22
22
|
.enum(['evaluate', 'simplify', 'derivative'])
|
|
23
23
|
.default('evaluate')
|
|
@@ -51,6 +51,17 @@ export const calculateTool = tool('calculate', {
|
|
|
51
51
|
.string()
|
|
52
52
|
.describe('Type of result as reported by math.js: number, BigNumber, Complex, DenseMatrix, Unit, string, boolean. Symbolic operations return "string".'),
|
|
53
53
|
expression: z.string().describe('The original expression as received.'),
|
|
54
|
+
operation: z
|
|
55
|
+
.enum(['evaluate', 'simplify', 'derivative'])
|
|
56
|
+
.describe('The operation that was applied.'),
|
|
57
|
+
scopeVars: z
|
|
58
|
+
.array(z.string())
|
|
59
|
+
.optional()
|
|
60
|
+
.describe('Keys from the scope that were active during evaluation. Omitted when no scope was provided. Values are omitted to keep output compact.'),
|
|
61
|
+
precisionUsed: z
|
|
62
|
+
.number()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe('Significant-digit precision applied to the result. Omitted when full precision was used or the operation is symbolic.'),
|
|
54
65
|
}),
|
|
55
66
|
errors: [
|
|
56
67
|
{
|
|
@@ -80,8 +91,8 @@ export const calculateTool = tool('calculate', {
|
|
|
80
91
|
{
|
|
81
92
|
reason: 'disallowed_result_type',
|
|
82
93
|
code: JsonRpcErrorCode.ValidationError,
|
|
83
|
-
when: 'Result
|
|
84
|
-
recovery: 'Rewrite the expression to produce a value (number, matrix, unit) instead of a function or
|
|
94
|
+
when: 'Result is a function, parser, or multi-expression ResultSet, or the expression converts a function to a string (e.g. `cos.toString()`) — security guard.',
|
|
95
|
+
recovery: 'Rewrite the expression to produce a value (number, matrix, unit) instead of a function or its source.',
|
|
85
96
|
},
|
|
86
97
|
{
|
|
87
98
|
reason: 'result_too_large',
|
|
@@ -123,25 +134,47 @@ export const calculateTool = tool('calculate', {
|
|
|
123
134
|
switch (operation) {
|
|
124
135
|
case 'evaluate':
|
|
125
136
|
ctx.log.info('Evaluated expression', { expression });
|
|
126
|
-
return {
|
|
137
|
+
return {
|
|
138
|
+
...math.evaluateExpression(expression, ctx, scope, precision),
|
|
139
|
+
expression,
|
|
140
|
+
operation,
|
|
141
|
+
// Omit context fields that carry no signal: scopeVars only when a scope
|
|
142
|
+
// was supplied, precisionUsed only when a precision was applied (#14).
|
|
143
|
+
...(scope ? { scopeVars: Object.keys(scope) } : {}),
|
|
144
|
+
...(precision !== undefined ? { precisionUsed: precision } : {}),
|
|
145
|
+
};
|
|
127
146
|
case 'simplify':
|
|
128
147
|
ctx.log.info('Simplified expression', { expression });
|
|
129
|
-
|
|
148
|
+
// Symbolic operations never carry scope/precision context — omit both.
|
|
149
|
+
return {
|
|
150
|
+
...math.simplifyExpression(expression, ctx),
|
|
151
|
+
expression,
|
|
152
|
+
operation,
|
|
153
|
+
};
|
|
130
154
|
case 'derivative':
|
|
131
155
|
if (!variable) {
|
|
132
156
|
throw ctx.fail('derivative_missing_variable', "The 'variable' parameter is required when operation is 'derivative'.", { ...ctx.recoveryFor('derivative_missing_variable') });
|
|
133
157
|
}
|
|
134
158
|
ctx.log.info('Differentiated expression', { expression, variable });
|
|
135
|
-
|
|
159
|
+
// Symbolic operations never carry scope/precision context — omit both.
|
|
160
|
+
return {
|
|
161
|
+
...math.differentiateExpression(expression, variable, ctx),
|
|
162
|
+
expression,
|
|
163
|
+
operation,
|
|
164
|
+
};
|
|
136
165
|
default:
|
|
137
166
|
throw new Error(`Unhandled operation: ${operation}`);
|
|
138
167
|
}
|
|
139
168
|
},
|
|
140
|
-
format: (output) =>
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
169
|
+
format: (output) => {
|
|
170
|
+
const scopeVars = output.scopeVars && output.scopeVars.length > 0 ? output.scopeVars.join(', ') : 'none';
|
|
171
|
+
const precision = output.precisionUsed ?? 'full';
|
|
172
|
+
return [
|
|
173
|
+
{
|
|
174
|
+
type: 'text',
|
|
175
|
+
text: `**Expression:** \`${output.expression}\`\n**Operation:** ${output.operation}\n**Result:** ${output.result}\n**Type:** ${output.resultType}\n**Scope variables:** ${scopeVars}\n**Precision:** ${precision}`,
|
|
176
|
+
},
|
|
177
|
+
];
|
|
178
|
+
},
|
|
146
179
|
});
|
|
147
180
|
//# sourceMappingURL=calculate.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculate.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/calculate.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE;IAC7C,WAAW,EACT,0NAA0N;IAC5N,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,KAAK;KACrB;IACD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CACP,
|
|
1
|
+
{"version":3,"file":"calculate.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/calculate.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import type { ServerConfig } from '../../config/server-config.js';
|
|
|
9
9
|
import type { MathResult } from './types.js';
|
|
10
10
|
export declare class MathService {
|
|
11
11
|
private readonly evaluate;
|
|
12
|
+
private readonly parse;
|
|
12
13
|
private readonly simplify;
|
|
13
14
|
private readonly derivative;
|
|
14
15
|
private readonly simplifyRules;
|
|
@@ -29,8 +30,25 @@ export declare class MathService {
|
|
|
29
30
|
private validateScope;
|
|
30
31
|
/** Reject result types that leak internals (functions, parsers, multi-expression ResultSets). */
|
|
31
32
|
private validateResultType;
|
|
33
|
+
/** Reject results holding a non-finite value (Infinity, -Infinity, NaN), including inside matrices and complex numbers. */
|
|
34
|
+
private validateFinite;
|
|
32
35
|
/** Reject results that exceed the configured maximum size. */
|
|
33
36
|
private validateResultSize;
|
|
37
|
+
/**
|
|
38
|
+
* Reject expressions that access `.toString` / `.toLocaleString` on any value.
|
|
39
|
+
* math.js permits these methods on function-valued identifiers (`cos.toString()`,
|
|
40
|
+
* `import.toString()`), returning the function's source as a plain string — which
|
|
41
|
+
* slips past {@link validateResultType}, whose function defense only inspects the
|
|
42
|
+
* value AFTER stringification. The check is parse-time and AST-based rather than a
|
|
43
|
+
* runtime `Function.prototype` patch: math.js itself calls `toString` on functions
|
|
44
|
+
* internally while evaluating units, statistics, and complex results, so patching
|
|
45
|
+
* the prototype would reject legitimate expressions. No real calculator expression
|
|
46
|
+
* needs `.toString()`/`.toLocaleString()`, so blocking the accessor outright (dot
|
|
47
|
+
* or bracket form, on any operand) is both sufficient and side-effect-free. String
|
|
48
|
+
* literals that merely contain the text "toString" parse as ConstantNodes, not
|
|
49
|
+
* accessors, so they are unaffected.
|
|
50
|
+
*/
|
|
51
|
+
private validateNoFunctionStringification;
|
|
34
52
|
/** Runs a synchronous function inside a vm sandbox with timeout protection. */
|
|
35
53
|
private runWithTimeout;
|
|
36
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math-service.d.ts","sourceRoot":"","sources":["../../../src/services/math/math-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"math-service.d.ts","sourceRoot":"","sources":["../../../src/services/math/math-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA0L7C,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4D;IACrF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;IAC5F,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6D;IACxF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGX;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,YAAY;IAiChC,6EAA6E;IAC7E,kBAAkB,CAChB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,OAAO,EACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,SAAS,CAAC,EAAE,MAAM,GACjB,UAAU;IAuBb,qDAAqD;IACrD,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU;IAYhE,mFAAmF;IACnF,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU;IASvF,qFAAqF;IACrF,cAAc,IAAI,MAAM;IAIxB,OAAO,CAAC,aAAa;IAqBrB,uEAAuE;IACvE,OAAO,CAAC,aAAa;IAWrB,iGAAiG;IACjG,OAAO,CAAC,kBAAkB;IAS1B,2HAA2H;IAC3H,OAAO,CAAC,cAAc;IAStB,8DAA8D;IAC9D,OAAO,CAAC,kBAAkB;IAS1B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,iCAAiC;IAyBzC,+EAA+E;IAC/E,OAAO,CAAC,cAAc;CAoBvB;AAMD,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE1D;AAED,iDAAiD;AACjD,wBAAgB,cAAc,IAAI,WAAW,CAG5C"}
|
|
@@ -76,6 +76,14 @@ const REDACTED_CONSTANTS = {
|
|
|
76
76
|
* ResultSet indicates multi-expression evaluation (newline bypass).
|
|
77
77
|
*/
|
|
78
78
|
const BLOCKED_RESULT_TYPES = new Set(['function', 'Function', 'ResultSet', 'Parser']);
|
|
79
|
+
/**
|
|
80
|
+
* Method names that coerce a value to a string. Blocked at parse time on any
|
|
81
|
+
* accessor: `.toString()` / `.toLocaleString()` on a function-valued identifier
|
|
82
|
+
* (e.g. `cos.toString()`) otherwise returns internal source as a plain string,
|
|
83
|
+
* slipping past {@link BLOCKED_RESULT_TYPES} (which only sees the value after
|
|
84
|
+
* stringification). See {@link MathService.validateNoFunctionStringification}.
|
|
85
|
+
*/
|
|
86
|
+
const STRINGIFYING_METHODS = new Set(['toString', 'toLocaleString']);
|
|
79
87
|
/**
|
|
80
88
|
* Scope key names that could pollute the object prototype chain or shadow
|
|
81
89
|
* critical Object.prototype methods. Validated before passing to math.js.
|
|
@@ -96,14 +104,35 @@ const BLOCKED_SCOPE_KEYS = new Set([
|
|
|
96
104
|
'toLocaleString',
|
|
97
105
|
]);
|
|
98
106
|
/**
|
|
99
|
-
* Check for expression separators
|
|
100
|
-
*
|
|
101
|
-
*
|
|
107
|
+
* Check for expression separators (`;` or newline) that split the input into
|
|
108
|
+
* multiple statements. Three contexts are NOT separators and are skipped:
|
|
109
|
+
* - `;` inside `[...]` — a matrix row separator (`[1, 2; 3, 4]`).
|
|
110
|
+
* - `;` or a newline inside a double-quoted string literal — part of the data,
|
|
111
|
+
* not a statement break (`"a;b"`, `concat("a;b", "c")`).
|
|
112
|
+
* - `[` / `]` inside a string literal — they must not shift the bracket depth,
|
|
113
|
+
* or a string such as `"]"` would let a later top-level `;` slip past.
|
|
114
|
+
*
|
|
115
|
+
* Single quotes are NOT string delimiters in math.js — `'` is the transpose
|
|
116
|
+
* operator (`A'`) — so only `"` opens a string span, and a backslash escapes the
|
|
117
|
+
* next character within it (`"\""` stays open). The scan is intentionally
|
|
118
|
+
* lexical rather than a full parse: it only has to recognize quoted spans, and a
|
|
119
|
+
* genuine multi-statement input (`1+2; 3+4`) is still caught at depth 0.
|
|
102
120
|
*/
|
|
103
121
|
function hasExpressionSeparator(expr) {
|
|
104
122
|
let depth = 0;
|
|
105
|
-
|
|
106
|
-
|
|
123
|
+
let inString = false;
|
|
124
|
+
for (let i = 0; i < expr.length; i++) {
|
|
125
|
+
const ch = expr[i];
|
|
126
|
+
if (inString) {
|
|
127
|
+
if (ch === '\\')
|
|
128
|
+
i++;
|
|
129
|
+
else if (ch === '"')
|
|
130
|
+
inString = false;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (ch === '"')
|
|
134
|
+
inString = true;
|
|
135
|
+
else if (ch === '[')
|
|
107
136
|
depth++;
|
|
108
137
|
else if (ch === ']')
|
|
109
138
|
depth--;
|
|
@@ -114,8 +143,53 @@ function hasExpressionSeparator(expr) {
|
|
|
114
143
|
}
|
|
115
144
|
return false;
|
|
116
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Recursively test whether a math.js result holds any non-finite number
|
|
148
|
+
* (Infinity, -Infinity, NaN). The `undefined_result` guard must reach inside
|
|
149
|
+
* compound types: a `DenseMatrix`/`SparseMatrix` element or the real/imaginary
|
|
150
|
+
* part of a `Complex` can be non-finite while the outer value is an object — a
|
|
151
|
+
* scalar `typeof === 'number'` check would skip it and leak `Infinity` to clients.
|
|
152
|
+
*/
|
|
153
|
+
function containsNonFinite(value) {
|
|
154
|
+
if (typeof value === 'number')
|
|
155
|
+
return !Number.isFinite(value);
|
|
156
|
+
if (value === null || typeof value !== 'object')
|
|
157
|
+
return false;
|
|
158
|
+
if (Array.isArray(value))
|
|
159
|
+
return value.some(containsNonFinite);
|
|
160
|
+
// Complex: re/im are plain numbers.
|
|
161
|
+
if ('re' in value && 'im' in value) {
|
|
162
|
+
return containsNonFinite(value.re) || containsNonFinite(value.im);
|
|
163
|
+
}
|
|
164
|
+
// DenseMatrix / SparseMatrix expose toArray() → nested JS arrays.
|
|
165
|
+
if (typeof value.toArray === 'function') {
|
|
166
|
+
return containsNonFinite(value.toArray());
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Matches standard-notation function names math.js does not define — natural log
|
|
172
|
+
* `ln` and the inverse-trig `arc*` family — only at call sites (word boundary +
|
|
173
|
+
* `(` lookahead), so identifiers and scope variables are never rewritten.
|
|
174
|
+
*/
|
|
175
|
+
const NOTATION_ALIAS_PATTERN = /\b(ln|arc(?:sin|cos|tan|sec|csc|cot)h?)(?=\s*\()/g;
|
|
176
|
+
/**
|
|
177
|
+
* Rewrite standard mathematical notation to math.js canonical names before
|
|
178
|
+
* parsing: `ln` → `log` (natural log) and `arc<fn>` → `a<fn>` for inverse trig
|
|
179
|
+
* (`arcsin` → `asin`, `arctanh` → `atanh`, …). All 12 `a*` targets are math.js
|
|
180
|
+
* builtins, so every operation resolves them.
|
|
181
|
+
*
|
|
182
|
+
* The rewrite is name-level (not a `math.import` alias) deliberately: symbolic
|
|
183
|
+
* `derivative` matches on builtin function names, and an imported alias is not in
|
|
184
|
+
* its differentiation table — so an alias would fix evaluate/simplify but leave
|
|
185
|
+
* `derivative('ln(x)')` throwing. A pre-parse rewrite covers all three operations.
|
|
186
|
+
*/
|
|
187
|
+
function normalizeNotation(expression) {
|
|
188
|
+
return expression.replace(NOTATION_ALIAS_PATTERN, (name) => name === 'ln' ? 'log' : `a${name.slice(3)}`);
|
|
189
|
+
}
|
|
117
190
|
export class MathService {
|
|
118
191
|
evaluate;
|
|
192
|
+
parse;
|
|
119
193
|
simplify;
|
|
120
194
|
derivative;
|
|
121
195
|
simplifyRules;
|
|
@@ -128,6 +202,7 @@ export class MathService {
|
|
|
128
202
|
const math = create(all);
|
|
129
203
|
// Save references before overriding — these bypass the expression scope restrictions
|
|
130
204
|
this.evaluate = math.evaluate.bind(math);
|
|
205
|
+
this.parse = math.parse.bind(math);
|
|
131
206
|
this.simplify = math.simplify.bind(math);
|
|
132
207
|
this.derivative = math.derivative.bind(math);
|
|
133
208
|
this.simplifyRules = [...math.simplify.rules, ...TRIG_SIMPLIFY_RULES];
|
|
@@ -155,12 +230,12 @@ export class MathService {
|
|
|
155
230
|
this.validateInput(expression, ctx);
|
|
156
231
|
if (scope)
|
|
157
232
|
this.validateScope(scope, ctx);
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
233
|
+
const normalized = normalizeNotation(expression);
|
|
234
|
+
this.validateNoFunctionStringification(normalized, ctx);
|
|
235
|
+
const raw = this.runWithTimeout(() => (scope ? this.evaluate(normalized, scope) : this.evaluate(normalized)), ctx);
|
|
162
236
|
const resultType = this.typeOf(raw);
|
|
163
237
|
this.validateResultType(resultType, ctx);
|
|
238
|
+
this.validateFinite(raw, ctx);
|
|
164
239
|
// Match JS Number.toString thresholds — math.js defaults to exp ≥ 5,
|
|
165
240
|
// which would render 83810205 as "8.3810205e+7".
|
|
166
241
|
const result = this.format(raw, {
|
|
@@ -174,7 +249,8 @@ export class MathService {
|
|
|
174
249
|
/** Simplify an algebraic expression symbolically. */
|
|
175
250
|
simplifyExpression(expression, ctx) {
|
|
176
251
|
this.validateInput(expression, ctx);
|
|
177
|
-
const
|
|
252
|
+
const normalized = normalizeNotation(expression);
|
|
253
|
+
const simplified = this.runWithTimeout(() => this.simplify(normalized, this.simplifyRules), ctx);
|
|
178
254
|
const result = simplified.toString();
|
|
179
255
|
this.validateResultSize(result, ctx);
|
|
180
256
|
return { result, resultType: 'string' };
|
|
@@ -182,7 +258,8 @@ export class MathService {
|
|
|
182
258
|
/** Compute the symbolic derivative of an expression with respect to a variable. */
|
|
183
259
|
differentiateExpression(expression, variable, ctx) {
|
|
184
260
|
this.validateInput(expression, ctx);
|
|
185
|
-
const
|
|
261
|
+
const normalized = normalizeNotation(expression);
|
|
262
|
+
const derived = this.runWithTimeout(() => this.derivative(normalized, variable), ctx);
|
|
186
263
|
const result = derived.toString();
|
|
187
264
|
this.validateResultSize(result, ctx);
|
|
188
265
|
return { result, resultType: 'string' };
|
|
@@ -219,12 +296,51 @@ export class MathService {
|
|
|
219
296
|
throw validationError(`Expression produced a ${resultType} — only numeric, string, matrix, complex, unit, and boolean results are allowed.`, { reason: 'disallowed_result_type', ...ctx.recoveryFor('disallowed_result_type') });
|
|
220
297
|
}
|
|
221
298
|
}
|
|
299
|
+
/** Reject results holding a non-finite value (Infinity, -Infinity, NaN), including inside matrices and complex numbers. */
|
|
300
|
+
validateFinite(raw, ctx) {
|
|
301
|
+
if (containsNonFinite(raw)) {
|
|
302
|
+
throw validationError('Expression evaluated to a non-finite result (Infinity, -Infinity, or NaN) — this typically means the operation is mathematically undefined (e.g., division by zero, log of zero). Check the expression.', { reason: 'undefined_result', ...ctx.recoveryFor('undefined_result') });
|
|
303
|
+
}
|
|
304
|
+
}
|
|
222
305
|
/** Reject results that exceed the configured maximum size. */
|
|
223
306
|
validateResultSize(result, ctx) {
|
|
224
307
|
if (result.length > this.config.maxResultLength) {
|
|
225
308
|
throw validationError(`Result exceeds maximum size (${this.config.maxResultLength} characters). Reduce matrix dimensions or simplify the expression.`, { reason: 'result_too_large', ...ctx.recoveryFor('result_too_large') });
|
|
226
309
|
}
|
|
227
310
|
}
|
|
311
|
+
/**
|
|
312
|
+
* Reject expressions that access `.toString` / `.toLocaleString` on any value.
|
|
313
|
+
* math.js permits these methods on function-valued identifiers (`cos.toString()`,
|
|
314
|
+
* `import.toString()`), returning the function's source as a plain string — which
|
|
315
|
+
* slips past {@link validateResultType}, whose function defense only inspects the
|
|
316
|
+
* value AFTER stringification. The check is parse-time and AST-based rather than a
|
|
317
|
+
* runtime `Function.prototype` patch: math.js itself calls `toString` on functions
|
|
318
|
+
* internally while evaluating units, statistics, and complex results, so patching
|
|
319
|
+
* the prototype would reject legitimate expressions. No real calculator expression
|
|
320
|
+
* needs `.toString()`/`.toLocaleString()`, so blocking the accessor outright (dot
|
|
321
|
+
* or bracket form, on any operand) is both sufficient and side-effect-free. String
|
|
322
|
+
* literals that merely contain the text "toString" parse as ConstantNodes, not
|
|
323
|
+
* accessors, so they are unaffected.
|
|
324
|
+
*/
|
|
325
|
+
validateNoFunctionStringification(expr, ctx) {
|
|
326
|
+
let ast;
|
|
327
|
+
try {
|
|
328
|
+
ast = this.parse(expr);
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
// Let the evaluate path surface parse errors with full mathjs context.
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const accessesStringifier = ast.filter((node) => {
|
|
335
|
+
if (node.type !== 'IndexNode')
|
|
336
|
+
return false;
|
|
337
|
+
const { dimensions } = node;
|
|
338
|
+
return dimensions.some((dim) => dim.type === 'ConstantNode' && STRINGIFYING_METHODS.has(String(dim.value)));
|
|
339
|
+
});
|
|
340
|
+
if (accessesStringifier.length > 0) {
|
|
341
|
+
throw validationError('Converting a function to a string is not allowed — it would expose internal source. Only numeric, string, matrix, complex, unit, and boolean results are allowed.', { reason: 'disallowed_result_type', ...ctx.recoveryFor('disallowed_result_type') });
|
|
342
|
+
}
|
|
343
|
+
}
|
|
228
344
|
/** Runs a synchronous function inside a vm sandbox with timeout protection. */
|
|
229
345
|
runWithTimeout(fn, ctx) {
|
|
230
346
|
const sandbox = { fn, result: undefined };
|
|
@@ -287,11 +403,13 @@ const HELP_CONTENT = `# Calculator Help
|
|
|
287
403
|
|
|
288
404
|
## Functions
|
|
289
405
|
|
|
406
|
+
> **Standard notation accepted:** \`ln\` works as natural log (canonical \`log\`), and the \`arc*\` inverse-trig names (\`arcsin\`, \`arccos\`, \`arctan\`, \`arcsinh\`, …) work as their \`a*\` equivalents (\`asin\`, \`acos\`, \`atan\`, …). Both forms are valid across evaluate, simplify, and derivative.
|
|
407
|
+
|
|
290
408
|
### Arithmetic
|
|
291
|
-
abs, ceil, floor, round, sign, sqrt, cbrt, exp, expm1, log, log2, log10, log1p, pow, mod, gcd, lcm, nthRoot, hypot, fix, cube, square, unaryMinus, unaryPlus
|
|
409
|
+
abs, ceil, floor, round, sign, sqrt, cbrt, exp, expm1, log (also: ln), log2, log10, log1p, pow, mod, gcd, lcm, nthRoot, hypot, fix, cube, square, unaryMinus, unaryPlus
|
|
292
410
|
|
|
293
411
|
### Trigonometry
|
|
294
|
-
sin, cos, tan, asin, acos, atan, atan2, sinh, cosh, tanh, asinh, acosh, atanh, sec, csc, cot, asec, acsc, acot, sech, csch, coth
|
|
412
|
+
sin, cos, tan, asin (arcsin), acos (arccos), atan (arctan), atan2, sinh, cosh, tanh, asinh (arcsinh), acosh (arccosh), atanh (arctanh), sec, csc, cot, asec (arcsec), acsc (arccsc), acot (arccot), sech (arcsech), csch (arccsch), coth (arccoth)
|
|
295
413
|
|
|
296
414
|
### Statistics
|
|
297
415
|
mean (aliases: average, avg), median, mode, std, variance, min, max, sum, prod, quantileSeq, mad, count
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math-service.js","sourceRoot":"","sources":["../../../src/services/math/math-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,GAAG,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"math-service.js","sourceRoot":"","sources":["../../../src/services/math/math-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/calculator-mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Evaluate, simplify, and differentiate mathematical expressions via MCP. STDIO or Streamable HTTP.",
|
|
5
5
|
"mcpName": "io.github.cyanheads/calculator-mcp-server",
|
|
6
6
|
"type": "module",
|
package/server.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/cyanheads/calculator-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.3.0",
|
|
10
10
|
"remotes": [
|
|
11
11
|
{
|
|
12
12
|
"type": "streamable-http",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
20
20
|
"identifier": "@cyanheads/calculator-mcp-server",
|
|
21
21
|
"runtimeHint": "bun",
|
|
22
|
-
"version": "0.
|
|
22
|
+
"version": "0.3.0",
|
|
23
23
|
"packageArguments": [
|
|
24
24
|
{
|
|
25
25
|
"type": "positional",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
70
70
|
"identifier": "@cyanheads/calculator-mcp-server",
|
|
71
71
|
"runtimeHint": "bun",
|
|
72
|
-
"version": "0.
|
|
72
|
+
"version": "0.3.0",
|
|
73
73
|
"packageArguments": [
|
|
74
74
|
{
|
|
75
75
|
"type": "positional",
|