mcpgraph 0.1.19 → 0.1.21

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.
Files changed (52) hide show
  1. package/README.md +69 -48
  2. package/dist/api.d.ts +8 -4
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +13 -4
  5. package/dist/api.js.map +1 -1
  6. package/dist/config/expression-validator.d.ts.map +1 -1
  7. package/dist/config/expression-validator.js +12 -10
  8. package/dist/config/expression-validator.js.map +1 -1
  9. package/dist/config/loader.d.ts +8 -2
  10. package/dist/config/loader.d.ts.map +1 -1
  11. package/dist/config/loader.js +16 -2
  12. package/dist/config/loader.js.map +1 -1
  13. package/dist/config/mcp-loader.d.ts +13 -0
  14. package/dist/config/mcp-loader.d.ts.map +1 -0
  15. package/dist/config/mcp-loader.js +47 -0
  16. package/dist/config/mcp-loader.js.map +1 -0
  17. package/dist/config/schema.d.ts +292 -186
  18. package/dist/config/schema.d.ts.map +1 -1
  19. package/dist/config/schema.js +5 -6
  20. package/dist/config/schema.js.map +1 -1
  21. package/dist/errors/mcp-tool-error.d.ts +46 -0
  22. package/dist/errors/mcp-tool-error.d.ts.map +1 -0
  23. package/dist/errors/mcp-tool-error.js +63 -0
  24. package/dist/errors/mcp-tool-error.js.map +1 -0
  25. package/dist/execution/executor.d.ts +2 -2
  26. package/dist/execution/executor.d.ts.map +1 -1
  27. package/dist/execution/executor.js +11 -9
  28. package/dist/execution/executor.js.map +1 -1
  29. package/dist/execution/nodes/mcp-tool-executor.d.ts.map +1 -1
  30. package/dist/execution/nodes/mcp-tool-executor.js +49 -15
  31. package/dist/execution/nodes/mcp-tool-executor.js.map +1 -1
  32. package/dist/graph/validator.d.ts.map +1 -1
  33. package/dist/graph/validator.js +52 -69
  34. package/dist/graph/validator.js.map +1 -1
  35. package/dist/main.js +23 -5
  36. package/dist/main.js.map +1 -1
  37. package/dist/mcp/client-manager.d.ts +12 -0
  38. package/dist/mcp/client-manager.d.ts.map +1 -1
  39. package/dist/mcp/client-manager.js +38 -4
  40. package/dist/mcp/client-manager.js.map +1 -1
  41. package/dist/types/config.d.ts +4 -5
  42. package/dist/types/config.d.ts.map +1 -1
  43. package/docs/building.md +76 -0
  44. package/docs/design.md +55 -43
  45. package/docs/github-pages-setup.md +492 -0
  46. package/docs/introspection-debugging.md +1 -1
  47. package/examples/api-usage.ts +3 -3
  48. package/examples/count_files.yaml +47 -52
  49. package/examples/loop_example.yaml +55 -58
  50. package/examples/switch_example.yaml +48 -55
  51. package/examples/test_minimal.yaml +23 -0
  52. package/package.json +2 -2
@@ -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;;IAM/B,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B1E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAQjB,eAAe;CAkF9B"}
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
- const transport = await this.createTransport(serverConfig);
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
- return new StdioClientTransport(transportOptions);
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":"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"}
1
+ {"version":3,"file":"client-manager.js","sourceRoot":"","sources":["../../src/mcp/client-manager.ts"],"names":[],"mappings":"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"}
@@ -8,15 +8,15 @@ export interface ExecutionLimits {
8
8
  export interface McpGraphConfig {
9
9
  version: string;
10
10
  server: ServerMetadata;
11
- servers?: Record<string, ServerConfig>;
11
+ mcpServers?: Record<string, ServerConfig>;
12
12
  executionLimits?: ExecutionLimits;
13
13
  tools: ToolDefinition[];
14
- nodes: NodeDefinition[];
15
14
  }
16
15
  export interface ServerMetadata {
17
16
  name: string;
18
17
  version: string;
19
- description: string;
18
+ title?: string;
19
+ instructions?: string;
20
20
  }
21
21
  export type ServerConfig = StdioServerConfig | SseServerConfig | StreamableHttpServerConfig;
22
22
  export interface StdioServerConfig {
@@ -43,6 +43,7 @@ export interface ToolDefinition {
43
43
  description: string;
44
44
  inputSchema: JsonSchema;
45
45
  outputSchema: JsonSchema;
46
+ nodes: NodeDefinition[];
46
47
  }
47
48
  export interface JsonSchema {
48
49
  type: string;
@@ -62,12 +63,10 @@ export interface BaseNode {
62
63
  }
63
64
  export interface EntryNode extends BaseNode {
64
65
  type: "entry";
65
- tool: string;
66
66
  next: string;
67
67
  }
68
68
  export interface ExitNode extends BaseNode {
69
69
  type: "exit";
70
- tool: string;
71
70
  }
72
71
  export interface McpNode extends BaseNode {
73
72
  type: "mcp";
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,YAAY,GACpB,iBAAiB,GACjB,eAAe,GACf,0BAA0B,CAAC;AAE/B,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,gBAAgB,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,UAAU,CAAC;IACzB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,aAAa,GACb,UAAU,CAAC;AAEf,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,IAAI,EAAE,MAAM,CAAC;CAEd;AAED,MAAM,WAAW,OAAQ,SAAQ,QAAQ;IACvC,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC"}
@@ -0,0 +1,76 @@
1
+ NOTE: This file is design notes only - do not implement anything here unless specifically asked
2
+
3
+ # Building mcpGraphs
4
+
5
+ To build an agent graph you need:
6
+
7
+ Basic knowledge of the mcpGraph file structure
8
+ - Assumes understanding of standard MCP data structures: MCP server metadata, tool description, mcpServers config
9
+
10
+ Understanding of graph structure, flow, nodes, and node types/details
11
+ - Including JSONata and JSON logic (both genrally, and as used in various nodes)
12
+
13
+ All relevant MCP servers and their configurations
14
+ - Including all tools provided with tool definitions
15
+
16
+ Testing tools
17
+ - In agent dev of our own examples, used primarily log output (which included error details)
18
+ - We have a full runtime harness with debugging, etc, that we could expose if needed
19
+
20
+ ## SKILL.md
21
+
22
+ We can provide file / data structure defintion and context in a skill
23
+
24
+ If we provide tooling (add, run, etc), we can describe that in the skill as well (what it is and how to use it)
25
+ - It will also be in the tooling tool descriptions
26
+
27
+ ## mcpGraphBuilder
28
+
29
+ Get all mcp servers and their configurations, and all tools they provide (search, progressive disclosure?)
30
+ - To support agents building graphs so they understand what tools they have and can access server config (which they usually couldn't)
31
+
32
+ Run a graph
33
+ - Would structured logging be enough to validate/debug (show each node, with context, output)
34
+
35
+ Do we want to use this to manage a set of graphs?
36
+ - Get tools (find tool)
37
+ - Run tool (debugging? log output, step, etc?)
38
+ - Add tool (fully implemented and tested tool, add by yaml file)
39
+ - Edit/remove tool?
40
+
41
+ For add/edit, this implies we can serialize them somehow
42
+ - Do we manage a directory of graph files with a shared mcp.json?
43
+ - Assumes we have write access to a directory
44
+ - Do we just use a single graph file with mcpServers defined inline and manage all of our tools/graphs in that file?
45
+ - Assumes we have write access to our graph file
46
+
47
+ If we're managing the tools as a set of graphs under this mcpGraph builder/manager, we're not really using the "server" part of the graph
48
+ - Are the name/title/instructions relevant, can we just ignore them and assume the tool description (and contents) will suffice?
49
+ - Would we want customizable metadata (esp instructions) for the builder/manager
50
+ - Maybe to distinguish them from each other, focus on set domain/tools available
51
+
52
+ ## Issues
53
+
54
+ Do we want to expose the mcpServers config to the graphs themselves?
55
+
56
+ What if we had a master mcpServers (mcp.json) that had all mcpServer configs used by any graph (basically everything the agent has access to)
57
+ - Graph builder has access to all servers (without access to their config details)
58
+ - Graphs have access to the servers they need (without access to their config details)
59
+ - Pass path to mcp.json as arg
60
+ - For config details that are secret, this makes sense, but for others, maybe less so (like a directory path or other kind of scope)
61
+
62
+ What about MCP servers that require a secret or OAuth (where the agent can talk to the MCP server)
63
+ - How can we talk to that MCP server securely without doing an agent tool call (which would defeat our purpose)
64
+ - This is where being an agent gateway (especially a "smart" on that is managing tool disclosure/aggregation/etc) would be handy
65
+
66
+ mcpGraphBuilder
67
+ - m / --mcp is path to mcp.json with all tools
68
+ - d / --dir is directory where graphs live?
69
+
70
+ mcpGraph
71
+ - -g / --graph specifies the graph configuration file to use
72
+ - -m / --mcp if provided, parse mcpServers from referenced mcp.json file (jsonc support?), add to graph
73
+ - If mcpServers provided in graph, add them (overiding any passed-in MCP server with the same name)
74
+
75
+ Maybe it's one MCP server that requires either --dir ("builder" mode) or --graph ("runner" mode)
76
+
package/docs/design.md CHANGED
@@ -55,12 +55,28 @@ To avoid embedding a full programming language while maintaining declarative, ob
55
55
 
56
56
  **Resources:** [JSONata Documentation](https://jsonata.org/)
57
57
 
58
- **YAML Example:**
58
+ **YAML Example (simple expression - single-quoted string):**
59
+ ```yaml
60
+ transform:
61
+ expr: '{ "result": "high" }'
62
+ ```
63
+
64
+ **YAML Example (complex expression - block scalar):**
59
65
  ```yaml
60
66
  transform:
61
- expr: "$merge([payload, {'timestamp': $now()}])"
67
+ expr: |
68
+ $executionCount("increment_node") = 0
69
+ ? { "counter": 1, "sum": 1, "target": $.entry_sum.n }
70
+ : { "counter": $nodeExecution("increment_node", -1).counter + 1, ... }
62
71
  ```
63
72
 
73
+ **Note on Expression Format:**
74
+ The `expr` field is a string containing a JSONata expression. In YAML, you can use either:
75
+ - **Single-quoted strings** (`'...'`) for simple, single-line expressions. This keeps the expression on one line and avoids the need for block scalars.
76
+ - **Block scalars** (`|`) for complex, multi-line expressions. This improves readability for expressions with conditional logic, nested objects, or multiple operations.
77
+
78
+ Both forms work identically - the expression is evaluated as a string by JSONata. Use single quotes for simple expressions and block scalars for complex ones to improve readability.
79
+
64
80
  ### Routing Decisions: JSON Logic
65
81
 
66
82
  **Why JSON Logic:**
@@ -123,7 +139,7 @@ Graph definitions should feel like Kubernetes manifests or GitHub Actions - decl
123
139
 
124
140
  The YAML configuration centers around MCP server and tool definitions:
125
141
 
126
- 1. **MCP Server Metadata**: Defines the MCP server information (name, version, description)
142
+ 1. **MCP Server Metadata**: Defines the MCP server information (name required, version required, title optional defaults to name, instructions optional)
127
143
  2. **Execution Limits** (optional): Guardrails to prevent infinite loops in cyclical graphs:
128
144
  - **`maxNodeExecutions`** (optional): Maximum total node executions across the entire graph. Default: `1000`. If execution reaches this limit, an error is thrown.
129
145
  - **`maxExecutionTimeMs`** (optional): Maximum wall-clock time for graph execution in milliseconds. Default: `300000` (5 minutes). If execution exceeds this time, an error is thrown.
@@ -156,13 +172,23 @@ version: "1.0"
156
172
  server:
157
173
  name: "fileUtils"
158
174
  version: "1.0.0"
159
- description: "File utilities"
175
+ title: "File utilities"
176
+ instructions: "This server provides file utility tools for counting files in directories."
160
177
 
161
178
  # Optional: Execution limits to prevent infinite loops
162
179
  executionLimits:
163
180
  maxNodeExecutions: 1000 # Maximum total node executions (default: 1000)
164
181
  maxExecutionTimeMs: 300000 # Maximum execution time in milliseconds (default: 300000 = 5 minutes)
165
182
 
183
+ # MCP Servers used by the graph
184
+ mcpServers:
185
+ filesystem:
186
+ command: "npx"
187
+ args:
188
+ - "-y"
189
+ - "@modelcontextprotocol/server-filesystem"
190
+ - "./tests/counting"
191
+
166
192
  # Tool Definitions
167
193
  tools:
168
194
  - name: "count_files"
@@ -181,45 +207,31 @@ tools:
181
207
  count:
182
208
  type: "number"
183
209
  description: "The number of files in the directory"
184
-
185
- # MCP Servers used by the graph
186
- servers:
187
- filesystem:
188
- command: "npx"
189
- args:
190
- - "-y"
191
- - "@modelcontextprotocol/server-filesystem"
192
- - "./tests/files"
193
-
194
- # Graph Nodes
195
- nodes:
196
- # Entry node: Receives tool arguments
197
- - id: "entry_count_files"
198
- type: "entry"
199
- tool: "count_files"
200
- next: "list_directory_node"
201
-
202
- # List directory contents
203
- - id: "list_directory_node"
204
- type: "mcp"
205
- server: "filesystem"
206
- tool: "list_directory"
207
- args:
208
- path: "$.entry_count_files.directory"
209
- next: "count_files_node"
210
-
211
- # Transform and count files
212
- - id: "count_files_node"
213
- type: "transform"
214
- transform:
215
- expr: |
216
- { "count": $count($split($.list_directory_node, "\n")) }
217
- next: "exit_count_files"
218
-
219
- # Exit node: Returns the count
220
- - id: "exit_count_files"
221
- type: "exit"
222
- tool: "count_files"
210
+ nodes:
211
+ # Entry node: Receives tool arguments
212
+ - id: "entry"
213
+ type: "entry"
214
+ next: "list_directory_node"
215
+
216
+ # List directory contents
217
+ - id: "list_directory_node"
218
+ type: "mcp"
219
+ server: "filesystem"
220
+ tool: "list_directory"
221
+ args:
222
+ path: "$.entry.directory"
223
+ next: "count_files_node"
224
+
225
+ # Transform and count files
226
+ - id: "count_files_node"
227
+ type: "transform"
228
+ transform:
229
+ expr: '{ "count": $count($split($.list_directory_node.content, "\n")) }'
230
+ next: "exit"
231
+
232
+ # Exit node: Returns the count
233
+ - id: "exit"
234
+ type: "exit"
223
235
  ```
224
236
 
225
237
  ## Key Design Principles