← WebMCP Directory

Tool tree

conode-7d6wbf06k-sinhaabhishekaakash-9586s-projects.vercel.app

Developer ToolsTools verified
Website
A WebMCP workflow canvas where an AI agent proposes nodes and edges through document.modelContext while the human keeps configuration, secrets and approval.
Explore capabilities
    get_workflowAnswer

    Read the current canvas: every node, its type, position, configuration and who created it, plus the edges between them. Call this before making changes so you build on what is already there. Secret fields are redacted and never returned.

    View tool JSON
    {
      "name": "get_workflow",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the current canvas: every node, its type, position, configuration and who created it, plus the edges between them. Call this before making changes so you build on what is already there. Secret fields are redacted and never returned.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    list_node_typesAnswer

    List every node type the canvas supports, with the configuration fields each one accepts. Use the returned ids as node_type when adding nodes. Fields marked human_only are secrets you cannot set.

    View tool JSON
    {
      "name": "list_node_types",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every node type the canvas supports, with the configuration fields each one accepts. Use the returned ids as node_type when adding nodes. Fields marked human_only are secrets you cannot set.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    add_nodeAction

    Place one node on the canvas. Prefer build_workflow when you are scaffolding several nodes at once. Positions are canvas pixels: lay flows out left to right, ~300px per column.

    View tool JSON
    {
      "name": "add_node",
      "kind": "act",
      "impl": "imperative",
      "description": "Place one node on the canvas. Prefer build_workflow when you are scaffolding several nodes at once. Positions are canvas pixels: lay flows out left to right, ~300px per column.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node_type": {
            "type": "string",
            "enum": [
              "webhook_trigger",
              "schedule_trigger",
              "event_trigger",
              "shopify_order_trigger",
              "shopify_get_order",
              "shopify_tag_order",
              "shopify_inventory_sync",
              "http_request",
              "slack_message",
              "db_query",
              "transform",
              "branch",
              "llm_call",
              "code_step",
              "human_approval"
            ],
            "description": "Id from list_node_types."
          },
          "label": {
            "type": "string",
            "description": "Human-readable name shown on the node."
          },
          "x": {
            "type": "number"
          },
          "y": {
            "type": "number"
          },
          "id": {
            "type": "string",
            "description": "Optional stable id so you can reference it in connect_nodes."
          },
          "config": {
            "type": "object",
            "description": "Field values, keyed by field key. Secrets are ignored."
          }
        },
        "required": [
          "node_type",
          "label",
          "x",
          "y"
        ],
        "additionalProperties": false
      }
    }
    connect_nodesAction

    Draw a directed edge between two existing nodes. Cycles are refused — the canvas is a DAG. For a condition node, label the two outgoing edges "true" and "else" so the YAML export can nest the branches correctly.

    View tool JSON
    {
      "name": "connect_nodes",
      "kind": "act",
      "impl": "imperative",
      "description": "Draw a directed edge between two existing nodes. Cycles are refused — the canvas is a DAG. For a condition node, label the two outgoing edges \"true\" and \"else\" so the YAML export can nest the branches correctly.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "source_id": {
            "type": "string"
          },
          "target_id": {
            "type": "string"
          },
          "label": {
            "type": "string",
            "description": "Optional edge label, e.g. \"true\" or \"else\"."
          }
        },
        "required": [
          "source_id",
          "target_id"
        ],
        "additionalProperties": false
      }
    }
    build_workflowAction

    Scaffold a whole flow in one call: create several nodes and the edges between them together. This is the fastest way to turn a natural-language request into a diagram. Reference nodes by the ids you give them here. Existing nodes are left untouched, so it is safe to extend a canvas.

    View tool JSON
    {
      "name": "build_workflow",
      "kind": "act",
      "impl": "imperative",
      "description": "Scaffold a whole flow in one call: create several nodes and the edges between them together. This is the fastest way to turn a natural-language request into a diagram. Reference nodes by the ids you give them here. Existing nodes are left untouched, so it is safe to extend a canvas.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "nodes": {
            "type": "array",
            "description": "Nodes to create.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Your reference id, reused in the edges array."
                },
                "node_type": {
                  "type": "string",
                  "enum": [
                    "webhook_trigger",
                    "schedule_trigger",
                    "event_trigger",
                    "shopify_order_trigger",
                    "shopify_get_order",
                    "shopify_tag_order",
                    "shopify_inventory_sync",
                    "http_request",
                    "slack_message",
                    "db_query",
                    "transform",
                    "branch",
                    "llm_call",
                    "code_step",
                    "human_approval"
                  ]
                },
                "label": {
                  "type": "string"
                },
                "config": {
                  "type": "object"
                },
                "x": {
                  "type": "number"
                },
                "y": {
                  "type": "number"
                }
              },
              "required": [
                "id",
                "node_type",
                "label"
              ]
            }
          },
          "edges": {
            "type": "array",
            "description": "Edges between the node ids above (or ids already on the canvas).",
            "items": {
              "type": "object",
              "properties": {
                "source": {
                  "type": "string"
                },
                "target": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                }
              },
              "required": [
                "source",
                "target"
              ]
            }
          },
          "summary": {
            "type": "string",
            "description": "One line describing what this flow does, shown to the human."
          },
          "auto_layout": {
            "type": "boolean",
            "description": "Lay the graph out automatically instead of using x/y. Defaults to true."
          }
        },
        "required": [
          "nodes"
        ],
        "additionalProperties": false
      }
    }
    update_node_configAction

    Change an existing node: its label, its note, or its configuration fields. Fields the human has edited are locked and will be reported back as skipped rather than overwritten — that is intentional, do not try to work around it.

    View tool JSON
    {
      "name": "update_node_config",
      "kind": "act",
      "impl": "imperative",
      "description": "Change an existing node: its label, its note, or its configuration fields. Fields the human has edited are locked and will be reported back as skipped rather than overwritten — that is intentional, do not try to work around it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node_id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "note": {
            "type": "string",
            "description": "Short annotation shown under the node title."
          },
          "config": {
            "type": "object",
            "description": "Field values to merge in."
          }
        },
        "required": [
          "node_id"
        ],
        "additionalProperties": false
      }
    }
    delete_nodeSensitive Action

    Remove a node and every edge attached to it. Destructive, so state why in the summary — the human sees it before it happens whenever review mode is on.

    View tool JSON
    {
      "name": "delete_node",
      "kind": "transact",
      "impl": "imperative",
      "description": "Remove a node and every edge attached to it. Destructive, so state why in the summary — the human sees it before it happens whenever review mode is on.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node_id": {
            "type": "string"
          },
          "reason": {
            "type": "string",
            "description": "Why this node should go. Shown to the human."
          }
        },
        "required": [
          "node_id"
        ],
        "additionalProperties": false
      }
    }
    auto_layoutAction

    Tidy the canvas into left-to-right layers. Positions the human dragged are overwritten, so ask before using it on a canvas someone has arranged by hand.

    View tool JSON
    {
      "name": "auto_layout",
      "kind": "act",
      "impl": "imperative",
      "description": "Tidy the canvas into left-to-right layers. Positions the human dragged are overwritten, so ask before using it on a canvas someone has arranged by hand.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    validate_workflowAction

    Check the canvas for structural problems: missing trigger, cycles, orphaned nodes, unset required fields, conditions with only one branch. Run this after building something.

    View tool JSON
    {
      "name": "validate_workflow",
      "kind": "act",
      "impl": "imperative",
      "description": "Check the canvas for structural problems: missing trigger, cycles, orphaned nodes, unset required fields, conditions with only one branch. Run this after building something.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    export_codeAction

    Compile the canvas into deployable code and open the export drawer for the human. Formats: "cloudflare" emits a Cloudflare Workflows class where each action is a step.do with retries and each approval gate is a step.waitForEvent; "worker" emits the src/index.ts entry module that starts and resumes runs; "wrangler" emits the matching wrangler.jsonc; "kestra" emits a declarative YAML flow. Secrets are always emitted as environment lookups, never as literal values.

    View tool JSON
    {
      "name": "export_code",
      "kind": "act",
      "impl": "imperative",
      "description": "Compile the canvas into deployable code and open the export drawer for the human. Formats: \"cloudflare\" emits a Cloudflare Workflows class where each action is a step.do with retries and each approval gate is a step.waitForEvent; \"worker\" emits the src/index.ts entry module that starts and resumes runs; \"wrangler\" emits the matching wrangler.jsonc; \"kestra\" emits a declarative YAML flow. Secrets are always emitted as environment lookups, never as literal values.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "format": {
            "type": "string",
            "enum": [
              "cloudflare",
              "worker",
              "wrangler",
              "kestra"
            ],
            "description": "Defaults to \"cloudflare\"."
          },
          "name": {
            "type": "string",
            "description": "Workflow class name (cloudflare) or flow id (kestra)."
          },
          "namespace": {
            "type": "string",
            "description": "Kestra namespace. Ignored by the other formats."
          }
        },
        "additionalProperties": false
      }
    }
    simulate_runAction

    Play a mock execution across the canvas in topological order so the human can watch the path light up. Nothing leaves the browser and no real system is touched.

    View tool JSON
    {
      "name": "simulate_run",
      "kind": "act",
      "impl": "imperative",
      "description": "Play a mock execution across the canvas in topological order so the human can watch the path light up. Nothing leaves the browser and no real system is touched.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    highlight_nodeAction

    Point at a node on the canvas and attach a short note to it. Use this to explain something visually instead of describing it in prose — "this is the step that will short out".

    View tool JSON
    {
      "name": "highlight_node",
      "kind": "act",
      "impl": "imperative",
      "description": "Point at a node on the canvas and attach a short note to it. Use this to explain something visually instead of describing it in prose — \"this is the step that will short out\".",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node_id": {
            "type": "string"
          },
          "note": {
            "type": "string",
            "description": "Short annotation. Pass an empty string to clear it."
          }
        },
        "required": [
          "node_id"
        ],
        "additionalProperties": false
      }
    }
    clear_canvasAction

    Wipe every node and edge. Always confirm with the human in conversation before calling this.

    View tool JSON
    {
      "name": "clear_canvas",
      "kind": "act",
      "impl": "imperative",
      "description": "Wipe every node and edge. Always confirm with the human in conversation before calling this.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "confirm": {
            "type": "boolean",
            "description": "Must be true. The human agreed to lose the canvas."
          }
        },
        "required": [
          "confirm"
        ],
        "additionalProperties": false
      }
    }