mcpgraph 0.1.20 → 0.1.22
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 +2 -2
- package/dist/api.d.ts +1 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +2 -0
- package/dist/api.js.map +1 -1
- package/dist/errors/mcp-tool-error.d.ts +46 -0
- package/dist/errors/mcp-tool-error.d.ts.map +1 -0
- package/dist/errors/mcp-tool-error.js +63 -0
- package/dist/errors/mcp-tool-error.js.map +1 -0
- package/dist/execution/nodes/mcp-tool-executor.d.ts.map +1 -1
- package/dist/execution/nodes/mcp-tool-executor.js +65 -16
- package/dist/execution/nodes/mcp-tool-executor.js.map +1 -1
- package/dist/mcp/client-manager.d.ts +12 -0
- package/dist/mcp/client-manager.d.ts.map +1 -1
- package/dist/mcp/client-manager.js +38 -4
- package/dist/mcp/client-manager.js.map +1 -1
- package/docs/design.md +1 -1
- package/examples/count_files.yaml +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -78,7 +78,7 @@ tools:
|
|
|
78
78
|
- id: "count_files_node"
|
|
79
79
|
type: "transform"
|
|
80
80
|
transform:
|
|
81
|
-
expr: '{ "count": $count($split($.list_directory_node, "\n")) }'
|
|
81
|
+
expr: '{ "count": $count($split($.list_directory_node.content, "\n")) }'
|
|
82
82
|
next: "exit"
|
|
83
83
|
|
|
84
84
|
# Exit node: Returns the count
|
|
@@ -138,7 +138,7 @@ The `expr` field in transform nodes is a string containing a JSONata expression.
|
|
|
138
138
|
- **Single-quoted strings** (`'...'`) for simple, single-line expressions:
|
|
139
139
|
```yaml
|
|
140
140
|
transform:
|
|
141
|
-
expr: '{ "count": $count($split($.list_directory_node, "\n")) }'
|
|
141
|
+
expr: '{ "count": $count($split($.list_directory_node.content, "\n")) }'
|
|
142
142
|
```
|
|
143
143
|
This keeps the expression on one line and is ideal for simple transformations.
|
|
144
144
|
|
package/dist/api.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { type ValidationError } from './graph/validator.js';
|
|
|
11
11
|
import type { ExecutionOptions, ExecutionResult as CoreExecutionResult, ExecutionController, ExecutionState, NodeExecutionRecord } from './types/execution.js';
|
|
12
12
|
export type { NodeDefinition, McpGraphConfig } from './types/config.js';
|
|
13
13
|
export type { ExecutionOptions, ExecutionHooks, ExecutionController, ExecutionState, ExecutionStatus, NodeExecutionRecord, ExecutionTelemetry, } from './types/execution.js';
|
|
14
|
+
export { ToolCallMcpError, ToolCallError } from './errors/mcp-tool-error.js';
|
|
14
15
|
export interface ToolInfo {
|
|
15
16
|
name: string;
|
|
16
17
|
description: string;
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,IAAI,mBAAmB,EACtC,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxE,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/api.js
CHANGED
|
@@ -11,6 +11,8 @@ import { loadConfig } from './config/loader.js';
|
|
|
11
11
|
import { validateGraph } from './graph/validator.js';
|
|
12
12
|
import { GraphExecutor } from './execution/executor.js';
|
|
13
13
|
import { McpClientManager } from './mcp/client-manager.js';
|
|
14
|
+
// Re-export error types
|
|
15
|
+
export { ToolCallMcpError, ToolCallError } from './errors/mcp-tool-error.js';
|
|
14
16
|
export class McpGraphApi {
|
|
15
17
|
config;
|
|
16
18
|
executor;
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for MCP tool execution errors
|
|
3
|
+
*/
|
|
4
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Error thrown when an MCP protocol-level error occurs during tool execution
|
|
7
|
+
* (e.g., connection failures, transport errors, server crashes)
|
|
8
|
+
*
|
|
9
|
+
* Extends McpError to preserve MCP error structure (code, message, data)
|
|
10
|
+
* and adds stderr output from the MCP server process
|
|
11
|
+
*/
|
|
12
|
+
export declare class ToolCallMcpError extends McpError {
|
|
13
|
+
/**
|
|
14
|
+
* Array of stderr lines captured from the MCP server process
|
|
15
|
+
* This is particularly useful for stdio-based MCP servers that write
|
|
16
|
+
* detailed error information to stderr
|
|
17
|
+
*/
|
|
18
|
+
readonly stderr: string[];
|
|
19
|
+
constructor(mcpError: McpError, stderr: string[]);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Error thrown when an MCP tool call completes successfully at the protocol level,
|
|
23
|
+
* but the tool itself returns an error response (result.isError = true)
|
|
24
|
+
*
|
|
25
|
+
* This represents a logical failure in the tool execution, not a protocol failure.
|
|
26
|
+
* The full result object is preserved for inspection.
|
|
27
|
+
*/
|
|
28
|
+
export declare class ToolCallError extends Error {
|
|
29
|
+
/**
|
|
30
|
+
* The complete result object from the MCP tool call
|
|
31
|
+
* This includes the error response, content, and any other result properties
|
|
32
|
+
*/
|
|
33
|
+
readonly result: {
|
|
34
|
+
isError?: boolean;
|
|
35
|
+
content: unknown[];
|
|
36
|
+
error?: unknown;
|
|
37
|
+
[key: string]: unknown;
|
|
38
|
+
};
|
|
39
|
+
constructor(result: {
|
|
40
|
+
isError?: boolean;
|
|
41
|
+
content: unknown[];
|
|
42
|
+
error?: unknown;
|
|
43
|
+
[key: string]: unknown;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=mcp-tool-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tool-error.d.ts","sourceRoot":"","sources":["../../src/errors/mcp-tool-error.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C;;;;OAIG;IACH,SAAgB,MAAM,EAAE,MAAM,EAAE,CAAC;gBAG/B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EAAE;CAYnB;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC;;;OAGG;IACH,SAAgB,MAAM,EAAE;QACtB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;gBAEU,MAAM,EAAE;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB;CAqBF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for MCP tool execution errors
|
|
3
|
+
*/
|
|
4
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Error thrown when an MCP protocol-level error occurs during tool execution
|
|
7
|
+
* (e.g., connection failures, transport errors, server crashes)
|
|
8
|
+
*
|
|
9
|
+
* Extends McpError to preserve MCP error structure (code, message, data)
|
|
10
|
+
* and adds stderr output from the MCP server process
|
|
11
|
+
*/
|
|
12
|
+
export class ToolCallMcpError extends McpError {
|
|
13
|
+
/**
|
|
14
|
+
* Array of stderr lines captured from the MCP server process
|
|
15
|
+
* This is particularly useful for stdio-based MCP servers that write
|
|
16
|
+
* detailed error information to stderr
|
|
17
|
+
*/
|
|
18
|
+
stderr;
|
|
19
|
+
constructor(mcpError, stderr) {
|
|
20
|
+
// Preserve original MCP error properties
|
|
21
|
+
super(mcpError.code, mcpError.message, mcpError.data);
|
|
22
|
+
this.name = 'ToolCallMcpError';
|
|
23
|
+
this.stderr = stderr;
|
|
24
|
+
// Enhance message with stderr for logging/debugging, but keep structured access
|
|
25
|
+
if (stderr.length > 0) {
|
|
26
|
+
this.message += `\n\nServer stderr output:\n${stderr.join('\n')}`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Error thrown when an MCP tool call completes successfully at the protocol level,
|
|
32
|
+
* but the tool itself returns an error response (result.isError = true)
|
|
33
|
+
*
|
|
34
|
+
* This represents a logical failure in the tool execution, not a protocol failure.
|
|
35
|
+
* The full result object is preserved for inspection.
|
|
36
|
+
*/
|
|
37
|
+
export class ToolCallError extends Error {
|
|
38
|
+
/**
|
|
39
|
+
* The complete result object from the MCP tool call
|
|
40
|
+
* This includes the error response, content, and any other result properties
|
|
41
|
+
*/
|
|
42
|
+
result;
|
|
43
|
+
constructor(result) {
|
|
44
|
+
// Extract error message from result content
|
|
45
|
+
const content = result.content;
|
|
46
|
+
let errorMessage = "Tool call failed";
|
|
47
|
+
if (content && content.length > 0) {
|
|
48
|
+
const firstContent = content[0];
|
|
49
|
+
if (firstContent && typeof firstContent === 'object' && 'text' in firstContent) {
|
|
50
|
+
errorMessage = firstContent.text || errorMessage;
|
|
51
|
+
}
|
|
52
|
+
else if (typeof firstContent === 'string') {
|
|
53
|
+
errorMessage = firstContent;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Include result in message for logging/debugging
|
|
57
|
+
const resultStr = JSON.stringify(result, null, 2);
|
|
58
|
+
super(`${errorMessage}\n\nTool call result:\n${resultStr}`);
|
|
59
|
+
this.name = 'ToolCallError';
|
|
60
|
+
this.result = result;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=mcp-tool-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tool-error.js","sourceRoot":"","sources":["../../src/errors/mcp-tool-error.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,OAAO,gBAAiB,SAAQ,QAAQ;IAC5C;;;;OAIG;IACa,MAAM,CAAW;IAEjC,YACE,QAAkB,EAClB,MAAgB;QAEhB,yCAAyC;QACzC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,gFAAgF;QAChF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,IAAI,8BAA8B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC;;;OAGG;IACa,MAAM,CAKpB;IAEF,YAAY,MAKX;QACC,4CAA4C;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAA+C,CAAC;QACvE,IAAI,YAAY,GAAG,kBAAkB,CAAC;QAEtC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;gBAC/E,YAAY,GAAG,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC;YACnD,CAAC;iBAAM,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBAC5C,YAAY,GAAG,YAAY,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,GAAG,YAAY,0BAA0B,SAAS,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -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;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,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;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAKpE,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,CAoHhD"}
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { evaluateJsonata } from "../../expressions/jsonata.js";
|
|
5
5
|
import { logger } from "../../logger.js";
|
|
6
|
+
import { ToolCallMcpError, ToolCallError } from "../../errors/mcp-tool-error.js";
|
|
7
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
6
8
|
export async function executeMcpToolNode(node, context, clientManager, serverConfig, startTime) {
|
|
7
9
|
logger.debug(`Executing MCP tool node: ${node.id} (${node.server}.${node.tool})`);
|
|
8
10
|
const exprContext = context.getData();
|
|
@@ -24,27 +26,73 @@ export async function executeMcpToolNode(node, context, clientManager, serverCon
|
|
|
24
26
|
logger.debug(`MCP tool args: ${JSON.stringify(transformedArgs, null, 2)}`);
|
|
25
27
|
logger.debug(`Expression context: ${JSON.stringify(exprContext, null, 2)}`);
|
|
26
28
|
// Get or create MCP client using server configuration
|
|
27
|
-
|
|
29
|
+
let client;
|
|
30
|
+
try {
|
|
31
|
+
client = await clientManager.getClient(node.server, serverConfig);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
// Handle errors during client initialization/connection
|
|
35
|
+
const stderr = client ? clientManager.getStderr(client) : [];
|
|
36
|
+
// If it's already an McpError, extend it with stderr
|
|
37
|
+
if (error instanceof McpError) {
|
|
38
|
+
throw new ToolCallMcpError(error, stderr);
|
|
39
|
+
}
|
|
40
|
+
// For non-McpError exceptions (transport errors, etc.), create a generic McpError
|
|
41
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
42
|
+
const mcpError = new McpError(-32000, `MCP client initialization failed: ${errorMessage}`, error);
|
|
43
|
+
throw new ToolCallMcpError(mcpError, stderr);
|
|
44
|
+
}
|
|
45
|
+
// Clear previous stderr for this client before making the call
|
|
46
|
+
clientManager.clearStderr(client);
|
|
28
47
|
// Call the tool
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
48
|
+
let result;
|
|
49
|
+
try {
|
|
50
|
+
result = await client.callTool({
|
|
51
|
+
name: node.tool,
|
|
52
|
+
arguments: transformedArgs,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const stderr = clientManager.getStderr(client);
|
|
57
|
+
// If it's already an McpError, extend it with stderr
|
|
58
|
+
if (error instanceof McpError) {
|
|
59
|
+
throw new ToolCallMcpError(error, stderr);
|
|
60
|
+
}
|
|
61
|
+
// For non-McpError exceptions (transport errors, etc.), create a generic McpError
|
|
62
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
63
|
+
const mcpError = new McpError(-32000, `MCP tool call failed: ${errorMessage}`, error);
|
|
64
|
+
throw new ToolCallMcpError(mcpError, stderr);
|
|
65
|
+
}
|
|
33
66
|
if (result.isError) {
|
|
34
|
-
|
|
35
|
-
|
|
67
|
+
// MCP protocol succeeded, but tool returned an error response
|
|
68
|
+
// Throw ToolCallError with the full result for inspection
|
|
69
|
+
throw new ToolCallError({
|
|
70
|
+
...result,
|
|
71
|
+
content: Array.isArray(result.content) ? result.content : [],
|
|
72
|
+
});
|
|
36
73
|
}
|
|
37
74
|
// Extract result content
|
|
38
|
-
|
|
75
|
+
// Check for structuredContent first (if present, use it as output)
|
|
39
76
|
let toolOutput;
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
77
|
+
if ('structuredContent' in result && result.structuredContent !== undefined) {
|
|
78
|
+
// Use structuredContent if available (regardless of content presence)
|
|
79
|
+
toolOutput = result.structuredContent;
|
|
80
|
+
}
|
|
81
|
+
else if ('content' in result) {
|
|
82
|
+
// Fall back to processing text content
|
|
83
|
+
const content = (result.content ?? []);
|
|
84
|
+
if (content[0] && typeof content[0] === "object" && "text" in content[0]) {
|
|
85
|
+
const textContent = content[0].text;
|
|
86
|
+
if (textContent) {
|
|
87
|
+
try {
|
|
88
|
+
toolOutput = JSON.parse(textContent);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
toolOutput = textContent;
|
|
92
|
+
}
|
|
45
93
|
}
|
|
46
|
-
|
|
47
|
-
toolOutput =
|
|
94
|
+
else {
|
|
95
|
+
toolOutput = content[0];
|
|
48
96
|
}
|
|
49
97
|
}
|
|
50
98
|
else {
|
|
@@ -52,7 +100,8 @@ export async function executeMcpToolNode(node, context, clientManager, serverCon
|
|
|
52
100
|
}
|
|
53
101
|
}
|
|
54
102
|
else {
|
|
55
|
-
|
|
103
|
+
// toolResult variant - not expected in normal flow, but handle it
|
|
104
|
+
throw new Error('Expected content-based result, got toolResult variant');
|
|
56
105
|
}
|
|
57
106
|
logger.debug(`MCP tool output: ${JSON.stringify(toolOutput, null, 2)}`);
|
|
58
107
|
const output = toolOutput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tool-executor.js","sourceRoot":"","sources":["../../../src/execution/nodes/mcp-tool-executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-tool-executor.js","sourceRoot":"","sources":["../../../src/execution/nodes/mcp-tool-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,21 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
|
5
5
|
import type { ServerConfig } from "../types/config.js";
|
|
6
6
|
export declare class McpClientManager {
|
|
7
7
|
private clients;
|
|
8
|
+
private stderrBuffers;
|
|
8
9
|
constructor();
|
|
9
10
|
getClient(serverName: string, serverConfig: ServerConfig): Promise<Client>;
|
|
10
11
|
closeAll(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Get captured stderr output for a client
|
|
14
|
+
* @param client - The MCP client instance
|
|
15
|
+
* @returns Array of stderr lines, or empty array if none
|
|
16
|
+
*/
|
|
17
|
+
getStderr(client: Client): string[];
|
|
18
|
+
/**
|
|
19
|
+
* Clear stderr buffer for a client (typically before a call to prepare for fresh output)
|
|
20
|
+
* @param client - The MCP client instance
|
|
21
|
+
*/
|
|
22
|
+
clearStderr(client: Client): void;
|
|
11
23
|
private createTransport;
|
|
12
24
|
}
|
|
13
25
|
//# sourceMappingURL=client-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/client-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAsB;;
|
|
1
|
+
{"version":3,"file":"client-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/client-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,aAAa,CAA4B;;IAO3C,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B1E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAS/B;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAInC;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;YAInB,eAAe;CAoG9B"}
|
|
@@ -8,15 +8,18 @@ import { StreamableHTTPClientTransport, } from "@modelcontextprotocol/sdk/client
|
|
|
8
8
|
import { logger } from "../logger.js";
|
|
9
9
|
export class McpClientManager {
|
|
10
10
|
clients;
|
|
11
|
+
stderrBuffers;
|
|
11
12
|
constructor() {
|
|
12
13
|
this.clients = new Map();
|
|
14
|
+
this.stderrBuffers = new WeakMap();
|
|
13
15
|
}
|
|
14
16
|
async getClient(serverName, serverConfig) {
|
|
15
17
|
if (this.clients.has(serverName)) {
|
|
16
18
|
return this.clients.get(serverName);
|
|
17
19
|
}
|
|
18
20
|
logger.info(`Creating MCP client for server: ${serverName} (type: ${getServerType(serverConfig)})`);
|
|
19
|
-
|
|
21
|
+
// Create transport and set up stderr capture
|
|
22
|
+
const { transport, stderrBuffer } = await this.createTransport(serverConfig);
|
|
20
23
|
const client = new Client({
|
|
21
24
|
name: `mcpgraph-${serverName}`,
|
|
22
25
|
version: "0.1.0",
|
|
@@ -24,6 +27,8 @@ export class McpClientManager {
|
|
|
24
27
|
capabilities: {},
|
|
25
28
|
});
|
|
26
29
|
await client.connect(transport);
|
|
30
|
+
// Associate stderr buffer with this client instance
|
|
31
|
+
this.stderrBuffers.set(client, stderrBuffer);
|
|
27
32
|
this.clients.set(serverName, client);
|
|
28
33
|
return client;
|
|
29
34
|
}
|
|
@@ -33,6 +38,22 @@ export class McpClientManager {
|
|
|
33
38
|
await client.close();
|
|
34
39
|
}
|
|
35
40
|
this.clients.clear();
|
|
41
|
+
// WeakMap doesn't need explicit clearing - it auto-cleans when clients are GC'd
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get captured stderr output for a client
|
|
45
|
+
* @param client - The MCP client instance
|
|
46
|
+
* @returns Array of stderr lines, or empty array if none
|
|
47
|
+
*/
|
|
48
|
+
getStderr(client) {
|
|
49
|
+
return this.stderrBuffers.get(client) || [];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Clear stderr buffer for a client (typically before a call to prepare for fresh output)
|
|
53
|
+
* @param client - The MCP client instance
|
|
54
|
+
*/
|
|
55
|
+
clearStderr(client) {
|
|
56
|
+
this.stderrBuffers.set(client, []);
|
|
36
57
|
}
|
|
37
58
|
async createTransport(serverConfig) {
|
|
38
59
|
// Default to stdio if type is not specified
|
|
@@ -43,11 +64,24 @@ export class McpClientManager {
|
|
|
43
64
|
command: stdioConfig.command,
|
|
44
65
|
args: stdioConfig.args,
|
|
45
66
|
env: process.env,
|
|
67
|
+
stderr: 'pipe',
|
|
46
68
|
};
|
|
47
69
|
if (stdioConfig.cwd) {
|
|
48
70
|
transportOptions.cwd = stdioConfig.cwd;
|
|
49
71
|
}
|
|
50
|
-
|
|
72
|
+
const transport = new StdioClientTransport(transportOptions);
|
|
73
|
+
// Create stderr buffer that will be associated with the client after creation
|
|
74
|
+
const stderrBuffer = [];
|
|
75
|
+
// Capture stderr output
|
|
76
|
+
if (transport.stderr) {
|
|
77
|
+
transport.stderr.on('data', (data) => {
|
|
78
|
+
const logEntry = data.toString().trim();
|
|
79
|
+
if (logEntry) {
|
|
80
|
+
stderrBuffer.push(logEntry);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return { transport, stderrBuffer };
|
|
51
85
|
}
|
|
52
86
|
else if (configType === "sse") {
|
|
53
87
|
const sseConfig = serverConfig;
|
|
@@ -72,7 +106,7 @@ export class McpClientManager {
|
|
|
72
106
|
if (sseConfig.eventSourceInit) {
|
|
73
107
|
options.eventSourceInit = sseConfig.eventSourceInit;
|
|
74
108
|
}
|
|
75
|
-
return new SSEClientTransport(new URL(sseConfig.url), options);
|
|
109
|
+
return { transport: new SSEClientTransport(new URL(sseConfig.url), options), stderrBuffer: [] };
|
|
76
110
|
}
|
|
77
111
|
else if (configType === "streamableHttp") {
|
|
78
112
|
const httpConfig = serverConfig;
|
|
@@ -94,7 +128,7 @@ export class McpClientManager {
|
|
|
94
128
|
headers: existingHeaders,
|
|
95
129
|
};
|
|
96
130
|
}
|
|
97
|
-
return new StreamableHTTPClientTransport(new URL(httpConfig.url), options);
|
|
131
|
+
return { transport: new StreamableHTTPClientTransport(new URL(httpConfig.url), options), stderrBuffer: [] };
|
|
98
132
|
}
|
|
99
133
|
else {
|
|
100
134
|
throw new Error(`Unsupported server transport type: ${configType}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-manager.js","sourceRoot":"","sources":["../../src/mcp/client-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAkC,MAAM,yCAAyC,CAAC;AAC7G,OAAO,EACL,6BAA6B,GAE9B,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtC,MAAM,OAAO,gBAAgB;IACnB,OAAO,CAAsB;
|
|
1
|
+
{"version":3,"file":"client-manager.js","sourceRoot":"","sources":["../../src/mcp/client-manager.ts"],"names":[],"mappings":"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"}
|
package/docs/design.md
CHANGED
|
@@ -226,7 +226,7 @@ tools:
|
|
|
226
226
|
- id: "count_files_node"
|
|
227
227
|
type: "transform"
|
|
228
228
|
transform:
|
|
229
|
-
expr: '{ "count": $count($split($.list_directory_node, "\n")) }'
|
|
229
|
+
expr: '{ "count": $count($split($.list_directory_node.content, "\n")) }'
|
|
230
230
|
next: "exit"
|
|
231
231
|
|
|
232
232
|
# Exit node: Returns the count
|
|
@@ -62,7 +62,7 @@ tools:
|
|
|
62
62
|
- id: "count_files_node"
|
|
63
63
|
type: "transform"
|
|
64
64
|
transform:
|
|
65
|
-
expr: '{ "count": $count($split($.list_directory_node, "\n")) }'
|
|
65
|
+
expr: '{ "count": $count($split($.list_directory_node.content, "\n")) }'
|
|
66
66
|
next: "exit"
|
|
67
67
|
|
|
68
68
|
# Exit node: Returns the count
|