{"ok":true,"site":{"host":"conode-7d6wbf06k-sinhaabhishekaakash-9586s-projects.vercel.app","url":"https://conode-7d6wbf06k-sinhaabhishekaakash-9586s-projects.vercel.app/","type":"live","desc":"A WebMCP workflow canvas where an AI agent proposes nodes and edges through document.modelContext while the human keeps configuration, secrets and approval.","tools":[{"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.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Developer Tools","apiSurface":"spec","toolCount":13}}