mcpgraph 0.1.30 → 0.1.31
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/README.md +3 -0
- package/dist/config/expression-validator.js +53 -11
- package/dist/config/expression-validator.js.map +1 -1
- package/dist/execution/arg-evaluator.d.ts +16 -0
- package/dist/execution/arg-evaluator.d.ts.map +1 -0
- package/dist/execution/arg-evaluator.js +54 -0
- package/dist/execution/arg-evaluator.js.map +1 -0
- package/dist/execution/nodes/mcp-tool-executor.d.ts.map +1 -1
- package/dist/execution/nodes/mcp-tool-executor.js +3 -14
- package/dist/execution/nodes/mcp-tool-executor.js.map +1 -1
- package/dist/toolkit/expression-testers.d.ts.map +1 -1
- package/dist/toolkit/expression-testers.js +25 -18
- package/dist/toolkit/expression-testers.js.map +1 -1
- package/docs/building.md +4 -0
- package/docs/no-code-code-mode.md +2 -1
- package/docs/toolkit.md +22 -2
- package/examples/file_utils.yaml +4 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,6 +17,9 @@ mcpGraph is an MCP (Model Context Protocol) server that exposes tools defined by
|
|
|
17
17
|
- **Observable**: Every transformation and decision is traceable
|
|
18
18
|
- **No Embedded Code**: All logic expressed using standard expression languages ([JSONata](https://jsonata.org/), [JSON Logic](https://jsonlogic.com/))
|
|
19
19
|
|
|
20
|
+
**Related Tools:**
|
|
21
|
+
- **mcpGraphToolkit**: An MCP server that provides tools for building, testing, and managing mcpGraph tools. Use it to discover available MCP servers, test expressions, and create graph tools interactively. See [mcpGraphToolkit Overview](docs/toolkit.md) for details.
|
|
22
|
+
|
|
20
23
|
## Example
|
|
21
24
|
|
|
22
25
|
Here's a simple example that counts files in a directory:
|
|
@@ -26,6 +26,52 @@ export function validateConfigExpressions(config) {
|
|
|
26
26
|
}
|
|
27
27
|
return errors;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Recursively validate argument expressions
|
|
31
|
+
*/
|
|
32
|
+
function validateArgExpressions(args, path = "args") {
|
|
33
|
+
// Expression object: { "expr": "..." }
|
|
34
|
+
if (typeof args === "object" &&
|
|
35
|
+
args !== null &&
|
|
36
|
+
!Array.isArray(args) &&
|
|
37
|
+
Object.keys(args).length === 1 &&
|
|
38
|
+
"expr" in args &&
|
|
39
|
+
typeof args.expr === "string") {
|
|
40
|
+
const expr = args.expr;
|
|
41
|
+
try {
|
|
42
|
+
validateJsonataSyntax(expr);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
46
|
+
throw new Error(`Invalid JSONata syntax in ${path}.expr: ${errorMessage}`);
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Expression object with other keys: error
|
|
51
|
+
if (typeof args === "object" &&
|
|
52
|
+
args !== null &&
|
|
53
|
+
!Array.isArray(args) &&
|
|
54
|
+
"expr" in args &&
|
|
55
|
+
Object.keys(args).length > 1) {
|
|
56
|
+
throw new Error(`Invalid expression object at ${path}: object with "expr" property must have only that property. ` +
|
|
57
|
+
`Found keys: ${Object.keys(args).join(", ")}`);
|
|
58
|
+
}
|
|
59
|
+
// Array: recurse into elements
|
|
60
|
+
if (Array.isArray(args)) {
|
|
61
|
+
args.forEach((item, index) => {
|
|
62
|
+
validateArgExpressions(item, `${path}[${index}]`);
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Object: recurse into properties
|
|
67
|
+
if (typeof args === "object" && args !== null) {
|
|
68
|
+
for (const [key, value] of Object.entries(args)) {
|
|
69
|
+
validateArgExpressions(value, `${path}.${key}`);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Primitive: no validation needed
|
|
74
|
+
}
|
|
29
75
|
/**
|
|
30
76
|
* Validate expressions in a single node
|
|
31
77
|
*/
|
|
@@ -42,17 +88,13 @@ function validateNodeExpressions(node, config) {
|
|
|
42
88
|
}
|
|
43
89
|
break;
|
|
44
90
|
case "mcp":
|
|
45
|
-
// Validate any JSONata expressions in args
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
53
|
-
throw new Error(`Invalid JSONata syntax in args.${key}: ${errorMessage}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
91
|
+
// Validate any JSONata expressions in args (recursively)
|
|
92
|
+
try {
|
|
93
|
+
validateArgExpressions(node.args);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
97
|
+
throw new Error(`Invalid JSONata syntax in args: ${errorMessage}`);
|
|
56
98
|
}
|
|
57
99
|
break;
|
|
58
100
|
case "switch":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-validator.js","sourceRoot":"","sources":["../../src/config/expression-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAGvE;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAsB;IAC9D,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,YAAY;oBACrB,MAAM,EAAE,IAAI,CAAC,EAAE;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,
|
|
1
|
+
{"version":3,"file":"expression-validator.js","sourceRoot":"","sources":["../../src/config/expression-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for evaluating MCP node arguments with recursive JSONata expression support
|
|
3
|
+
*/
|
|
4
|
+
import type { NodeExecutionRecord } from "../types/execution.js";
|
|
5
|
+
/**
|
|
6
|
+
* Recursively evaluate argument values, treating objects with single "expr" property as JSONata expressions
|
|
7
|
+
*
|
|
8
|
+
* Evaluation rules:
|
|
9
|
+
* 1. Object with exactly one key "expr" (string) → evaluate as JSONata
|
|
10
|
+
* 2. Object with "expr" and other keys → error (ambiguous)
|
|
11
|
+
* 3. Array → recurse into each element
|
|
12
|
+
* 4. Object (non-expr) → recurse into each property
|
|
13
|
+
* 5. Primitive → pass through as literal
|
|
14
|
+
*/
|
|
15
|
+
export declare function evaluateArgValue(value: unknown, context: Record<string, unknown>, history: NodeExecutionRecord[], currentIndex: number): Promise<unknown>;
|
|
16
|
+
//# sourceMappingURL=arg-evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arg-evaluator.d.ts","sourceRoot":"","sources":["../../src/execution/arg-evaluator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAIjE;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CA+ClB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for evaluating MCP node arguments with recursive JSONata expression support
|
|
3
|
+
*/
|
|
4
|
+
import { evaluateJsonata } from "../expressions/jsonata.js";
|
|
5
|
+
import { logger } from "../logger.js";
|
|
6
|
+
/**
|
|
7
|
+
* Recursively evaluate argument values, treating objects with single "expr" property as JSONata expressions
|
|
8
|
+
*
|
|
9
|
+
* Evaluation rules:
|
|
10
|
+
* 1. Object with exactly one key "expr" (string) → evaluate as JSONata
|
|
11
|
+
* 2. Object with "expr" and other keys → error (ambiguous)
|
|
12
|
+
* 3. Array → recurse into each element
|
|
13
|
+
* 4. Object (non-expr) → recurse into each property
|
|
14
|
+
* 5. Primitive → pass through as literal
|
|
15
|
+
*/
|
|
16
|
+
export async function evaluateArgValue(value, context, history, currentIndex) {
|
|
17
|
+
// Expression object: { "expr": "..." }
|
|
18
|
+
if (typeof value === "object" &&
|
|
19
|
+
value !== null &&
|
|
20
|
+
!Array.isArray(value) &&
|
|
21
|
+
"expr" in value) {
|
|
22
|
+
// If expr exists, it must be the only key and must be a string
|
|
23
|
+
if (Object.keys(value).length === 1) {
|
|
24
|
+
const exprValue = value.expr;
|
|
25
|
+
if (typeof exprValue !== "string") {
|
|
26
|
+
throw new Error(`Invalid expression object: "expr" property must be a string, got ${typeof exprValue}`);
|
|
27
|
+
}
|
|
28
|
+
const expr = exprValue;
|
|
29
|
+
const evaluated = await evaluateJsonata(expr, context, history, currentIndex);
|
|
30
|
+
logger.debug(`JSONata "${expr}" evaluated to: ${JSON.stringify(evaluated)}`);
|
|
31
|
+
return evaluated;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Expression object with other keys: error
|
|
35
|
+
throw new Error(`Invalid expression object: object with "expr" property must have only that property. ` +
|
|
36
|
+
`Found keys: ${Object.keys(value).join(", ")}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Array: recurse into elements
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
return Promise.all(value.map((item) => evaluateArgValue(item, context, history, currentIndex)));
|
|
42
|
+
}
|
|
43
|
+
// Object: recurse into properties
|
|
44
|
+
if (typeof value === "object" && value !== null) {
|
|
45
|
+
const result = {};
|
|
46
|
+
for (const [key, val] of Object.entries(value)) {
|
|
47
|
+
result[key] = await evaluateArgValue(val, context, history, currentIndex);
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
// Primitive: pass through as literal
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=arg-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arg-evaluator.js","sourceRoot":"","sources":["../../src/execution/arg-evaluator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAc,EACd,OAAgC,EAChC,OAA8B,EAC9B,YAAoB;IAEpB,uCAAuC;IACvC,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,MAAM,IAAI,KAAK,EACf,CAAC;QACD,+DAA+D;QAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,SAAS,GAAI,KAA2B,CAAC,IAAI,CAAC;YACpD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CACb,oEAAoE,OAAO,SAAS,EAAE,CACvF,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,SAAS,CAAC;YACvB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAC9E,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,mBAAmB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO,SAAS,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,MAAM,IAAI,KAAK,CACb,uFAAuF;gBACvF,eAAe,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qCAAqC;IACrC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tool-executor.d.ts","sourceRoot":"","sources":["../../../src/execution/nodes/mcp-tool-executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-tool-executor.d.ts","sourceRoot":"","sources":["../../../src/execution/nodes/mcp-tool-executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAOpE,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,gBAAgB,EAC/B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqFhD"}
|
|
@@ -1,29 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP tool node executor
|
|
3
3
|
*/
|
|
4
|
-
import { evaluateJsonata } from "../../expressions/jsonata.js";
|
|
5
4
|
import { logger } from "../../logger.js";
|
|
6
5
|
import { ToolCallMcpError, ToolCallError } from "../../errors/mcp-tool-error.js";
|
|
7
6
|
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
8
7
|
import { extractMcpToolOutput } from "../../mcp/tool-output-extractor.js";
|
|
8
|
+
import { evaluateArgValue } from "../arg-evaluator.js";
|
|
9
9
|
export async function executeMcpToolNode(node, context, clientManager, serverConfig, startTime) {
|
|
10
10
|
logger.debug(`Executing MCP tool node: ${node.id} (${node.server}.${node.tool})`);
|
|
11
11
|
const exprContext = context.getData();
|
|
12
12
|
const history = context.getHistory();
|
|
13
13
|
const currentIndex = history.length; // This will be the index after we add this execution
|
|
14
|
-
// Pre-transform:
|
|
15
|
-
const transformedArgs =
|
|
16
|
-
for (const [key, value] of Object.entries(node.args)) {
|
|
17
|
-
if (typeof value === "string" && value.startsWith("$")) {
|
|
18
|
-
// JSONata expression
|
|
19
|
-
const evaluated = await evaluateJsonata(value, exprContext, history, currentIndex);
|
|
20
|
-
transformedArgs[key] = evaluated;
|
|
21
|
-
logger.debug(`JSONata "${value}" evaluated to: ${JSON.stringify(evaluated)}`);
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
transformedArgs[key] = value;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
14
|
+
// Pre-transform: Recursively apply JSONata to format tool arguments
|
|
15
|
+
const transformedArgs = await evaluateArgValue(node.args, exprContext, history, currentIndex);
|
|
27
16
|
logger.debug(`MCP tool args: ${JSON.stringify(transformedArgs, null, 2)}`);
|
|
28
17
|
logger.debug(`Expression context: ${JSON.stringify(exprContext, null, 2)}`);
|
|
29
18
|
// Clear previous stderr for this server at the start of execution
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tool-executor.js","sourceRoot":"","sources":["../../../src/execution/nodes/mcp-tool-executor.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"mcp-tool-executor.js","sourceRoot":"","sources":["../../../src/execution/nodes/mcp-tool-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-testers.d.ts","sourceRoot":"","sources":["../../src/toolkit/expression-testers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"expression-testers.d.ts","sourceRoot":"","sources":["../../src/toolkit/expression-testers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAQ7C,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,oBAAoB,CAAC,CAkB/B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,oBAAoB,CAAC,CAe/B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,iBAAiB,CAAC,CA4G5B"}
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { evaluateJsonata, validateJsonataSyntax } from '../expressions/jsonata.js';
|
|
7
7
|
import { evaluateJsonLogic } from '../expressions/json-logic.js';
|
|
8
|
-
import { logger } from '../logger.js';
|
|
9
8
|
import { McpClientManager } from '../mcp/client-manager.js';
|
|
10
9
|
import { ToolCallError } from '../errors/mcp-tool-error.js';
|
|
11
10
|
import { extractMcpToolOutput } from '../mcp/tool-output-extractor.js';
|
|
11
|
+
import { evaluateArgValue } from '../execution/arg-evaluator.js';
|
|
12
12
|
/**
|
|
13
13
|
* Test a JSONata expression with context
|
|
14
14
|
*/
|
|
@@ -62,25 +62,15 @@ export async function testMcpTool(api, serverName, toolName, args, context) {
|
|
|
62
62
|
}
|
|
63
63
|
const serverConfig = config.mcpServers[serverName];
|
|
64
64
|
// Evaluate JSONata expressions in args if context is provided
|
|
65
|
-
const evaluatedArgs = {};
|
|
66
65
|
const exprContext = context || {};
|
|
67
66
|
const history = [];
|
|
68
67
|
const currentIndex = 0;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
logger.debug(`JSONata "${value}" evaluated to: ${JSON.stringify(evaluated)}`);
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
throw new Error(`Failed to evaluate JSONata expression "${value}" in arg "${key}": ${error instanceof Error ? error.message : String(error)}`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
evaluatedArgs[key] = value;
|
|
83
|
-
}
|
|
68
|
+
let evaluatedArgs;
|
|
69
|
+
try {
|
|
70
|
+
evaluatedArgs = await evaluateArgValue(args, exprContext, history, currentIndex);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
throw new Error(`Failed to evaluate JSONata expressions in args: ${error instanceof Error ? error.message : String(error)}`);
|
|
84
74
|
}
|
|
85
75
|
// Get client manager from API (we need to access it, but it's private)
|
|
86
76
|
// Instead, we'll create a temporary client manager for this test
|
|
@@ -111,7 +101,24 @@ export async function testMcpTool(api, serverName, toolName, args, context) {
|
|
|
111
101
|
executionTime,
|
|
112
102
|
};
|
|
113
103
|
// Include evaluated args if any JSONata expressions were used
|
|
114
|
-
|
|
104
|
+
// Check if any args contain expression objects
|
|
105
|
+
function hasExpressionObjects(value) {
|
|
106
|
+
if (typeof value === "object" &&
|
|
107
|
+
value !== null &&
|
|
108
|
+
!Array.isArray(value) &&
|
|
109
|
+
"expr" in value &&
|
|
110
|
+
Object.keys(value).length === 1) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
if (Array.isArray(value)) {
|
|
114
|
+
return value.some(item => hasExpressionObjects(item));
|
|
115
|
+
}
|
|
116
|
+
if (typeof value === "object" && value !== null) {
|
|
117
|
+
return Object.values(value).some(val => hasExpressionObjects(val));
|
|
118
|
+
}
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
if (context && hasExpressionObjects(args)) {
|
|
115
122
|
response.evaluatedArgs = evaluatedArgs;
|
|
116
123
|
}
|
|
117
124
|
return response;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-testers.js","sourceRoot":"","sources":["../../src/toolkit/expression-testers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"expression-testers.js","sourceRoot":"","sources":["../../src/toolkit/expression-testers.ts"],"names":[],"mappings":"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"}
|
package/docs/building.md
CHANGED
|
@@ -175,6 +175,10 @@ Prompt (one-shot, create and use tool):
|
|
|
175
175
|
|
|
176
176
|
Download the text contents of the web page https://world.hey.com/dhh/pay-yourself-first-e86f8147 to a local file, return the filename and size
|
|
177
177
|
|
|
178
|
+
DevRel prompt:
|
|
179
|
+
|
|
180
|
+
What did you struggle with in building that tool and how could the skill.md documentation or the mcpgraphtoolkit tooling be improved to help
|
|
181
|
+
|
|
178
182
|
NOTES:
|
|
179
183
|
|
|
180
184
|
First pass had a "graph/node" structure, no input node, malformed graph/output node, dependsOn elements - basically crazytown, second pass was correct
|
|
@@ -283,9 +283,10 @@ When using **mcpGraphToolkit** you pass an path to your mcpGraph file, as before
|
|
|
283
283
|
- **`deleteGraphTool`**: Delete a tool from the mcpGraph
|
|
284
284
|
|
|
285
285
|
### Tool Execution Tools
|
|
286
|
-
- **`runGraphTool`**: Run an exported tool from the mcpGraph. Can specify existing tool name or run a tool definition supplied in payload. Supports detailed error reporting and optional logging collection.
|
|
286
|
+
- **`runGraphTool`**: Run an exported tool from the mcpGraph. Can specify existing tool name or run a tool definition supplied in payload. Supports detailed error reporting and optional logging collection. Used both to test and run graph tools.
|
|
287
287
|
|
|
288
288
|
### Expression Testing Tools
|
|
289
|
+
- **`testMcpTool`**: Test an MCP tool (especially to confirm output)
|
|
289
290
|
- **`testJSONata`**: Test a JSONata expression with context
|
|
290
291
|
- **`testJSONLogic`**: Test a JSON Logic expression with context
|
|
291
292
|
|
package/docs/toolkit.md
CHANGED
|
@@ -48,7 +48,9 @@ mcpGraphToolkit is an MCP server that provides tools for building, testing, and
|
|
|
48
48
|
|
|
49
49
|
## Tools
|
|
50
50
|
|
|
51
|
-
mcpGraphToolkit provides
|
|
51
|
+
mcpGraphToolkit provides 12 tools organized into the following categories:
|
|
52
|
+
|
|
53
|
+
> **📖 For Agents:** If you're an AI agent using mcpGraphToolkit to build graph tools, see [mcpGraphToolkit SKILL.md](../skills/mcpgraphtoolkit/SKILL.md) for comprehensive guidance on using these tools effectively.
|
|
52
54
|
|
|
53
55
|
### Graph Discovery Tools
|
|
54
56
|
|
|
@@ -156,6 +158,24 @@ Tests a JSON Logic expression with context.
|
|
|
156
158
|
- `result` (any) - evaluation result (boolean for conditions)
|
|
157
159
|
- `error` (object, optional) - error details if failed
|
|
158
160
|
|
|
161
|
+
#### `testMcpTool`
|
|
162
|
+
Tests an MCP tool call directly to understand its output structure and behavior.
|
|
163
|
+
- **Input**:
|
|
164
|
+
- `server` (string) - name of the MCP server
|
|
165
|
+
- `tool` (string) - name of the tool to call
|
|
166
|
+
- `args` (object) - tool arguments (objects with `{ "expr": "..." }` are evaluated as JSONata recursively; if context is provided, expressions in args are evaluated)
|
|
167
|
+
- `context` (object, optional) - context object for JSONata expression evaluation in args
|
|
168
|
+
- **Output**:
|
|
169
|
+
- `output` (any) - tool execution output (matches what would be available in a graph node's execution context)
|
|
170
|
+
- `evaluatedArgs` (object, optional) - evaluated arguments (present if JSONata expressions were used)
|
|
171
|
+
- `executionTime` (number) - execution time in milliseconds
|
|
172
|
+
- `error` (object, optional) - error details if call failed
|
|
173
|
+
- **Behavior**:
|
|
174
|
+
- Calls the MCP tool directly without creating a graph
|
|
175
|
+
- Evaluates JSONata expressions in args if context is provided (using recursive `{ "expr": "..." }` syntax)
|
|
176
|
+
- Returns the same output structure that would be available in a graph node's execution context
|
|
177
|
+
- Useful for understanding tool behavior and output structure before building graph tools
|
|
178
|
+
|
|
159
179
|
## File Structure
|
|
160
180
|
|
|
161
181
|
```
|
|
@@ -265,7 +285,7 @@ The toolkit includes comprehensive test coverage:
|
|
|
265
285
|
|
|
266
286
|
### MCP Client Integration Tests
|
|
267
287
|
- **File**: `tests/toolkit-mcp-server.test.ts`
|
|
268
|
-
- Tests all
|
|
288
|
+
- Tests all 12 toolkit tools via MCP protocol
|
|
269
289
|
- Uses MCP SDK Client to connect to toolkit server via stdio
|
|
270
290
|
- Tests error handling and edge cases
|
|
271
291
|
- Tests logging collection functionality
|
package/examples/file_utils.yaml
CHANGED
|
@@ -55,7 +55,8 @@ tools:
|
|
|
55
55
|
server: "filesystem"
|
|
56
56
|
tool: "list_directory"
|
|
57
57
|
args:
|
|
58
|
-
path:
|
|
58
|
+
path:
|
|
59
|
+
expr: "$.entry.directory"
|
|
59
60
|
next: "count_files_node"
|
|
60
61
|
|
|
61
62
|
# Transform and count files
|
|
@@ -97,7 +98,8 @@ tools:
|
|
|
97
98
|
server: "filesystem"
|
|
98
99
|
tool: "list_directory_with_sizes"
|
|
99
100
|
args:
|
|
100
|
-
path:
|
|
101
|
+
path:
|
|
102
|
+
expr: "$.entry.directory"
|
|
101
103
|
next: "sum_sizes_node"
|
|
102
104
|
|
|
103
105
|
# Transform and sum file sizes
|