{"ok":true,"site":{"host":"canvasflow-two.vercel.app","url":"https://canvasflow-two.vercel.app/","type":"live","desc":"Collaborative analysis canvas for humans and AI agents with WebMCP in-browser tools, DuckDB SQL, and human-in-the-loop proposal queue.","tools":[{"name":"get_canvas_state","kind":"answer","impl":"imperative","description":"Return a compact index of canvas nodes, edges, and pending proposal count. Use this before mutating. Does not include cell data.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"inspect_node","kind":"answer","impl":"imperative","description":"Inspect one node. Returns title, type, trust, columns or a short text preview. Not the full file.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"The id of the node to inspect"}},"required":["nodeId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_add_node","kind":"act","impl":"imperative","description":"Queue a pending chart, table, or note on the canvas. It stays dashed until the user clicks Accept. It does not commit.","inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["chart","table","note"],"description":"Node type to create"},"title":{"type":"string","description":"Title of the card"},"x":{"type":"number","description":"Optional canvas X coordinate"},"y":{"type":"number","description":"Optional canvas Y coordinate"},"data":{"type":"object","description":"Node data payload (e.g. { text: \"...\" } for note or { kind: \"bar\", metric: \"gross_margin\", series: [...] } for chart)"}},"required":["type","title","data"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_update_node","kind":"act","impl":"imperative","description":"Queue a patch to an existing committed node's title or data. Does not commit until the user accepts.","inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"ID of the existing committed node to update"},"title":{"type":"string","description":"New title for the node"},"data":{"type":"object","description":"New data fields to merge into the node"}},"required":["nodeId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_link_nodes","kind":"act","impl":"imperative","description":"Queue an edge between two committed nodes. Relation is derived-from or annotates. Does not commit until accepted.","inputSchema":{"type":"object","properties":{"from":{"type":"string","description":"Source node id"},"to":{"type":"string","description":"Target node id"},"relation":{"type":"string","enum":["derived-from","annotates"],"description":"Relationship type"}},"required":["from","to","relation"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"load_dataset","kind":"act","impl":"imperative","description":"Register an uploaded CSV already on the canvas as a queryable DuckDB table. Does not read files from disk. Returns table name and columns.","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Node id of the dataset to register with DuckDB"}},"required":["nodeId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Productivity & Business","apiSurface":"spec","toolCount":6}}