{"ok":true,"site":{"host":"canvasops-webmcp.vercel.app","url":"https://canvasops-webmcp.vercel.app/","type":"live","desc":"A collaborative architecture canvas where humans and agents configure cloud infrastructure together.","tools":[{"name":"analyze_current_architecture","kind":"answer","impl":"imperative","description":"Read the complete live graph, positions, configuration, connections, cost, active-policy findings, resilience score, and architecture fingerprint. Call before modifying an unfamiliar architecture.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_active_policy","kind":"answer","impl":"imperative","description":"Read the exact user-selected architecture policy, including its preset, monthly budget, required regions, minimum replicas, and always-on safety checks. Call before validating or proposing policy-sensitive changes.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_component_catalog","kind":"answer","impl":"imperative","description":"Read the complete supported semantic component vocabulary and defaults. Call before designing or expanding an architecture. Use these types exactly and never invent unsupported component types.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_selection_context","kind":"answer","impl":"imperative","description":"Read the user's current node and connection selection. Call when the user says this, selected, these nodes, or refers to the current focus.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"validate_architecture","kind":"answer","impl":"imperative","description":"Deterministically validate the live architecture against budget, region, replica, connectivity, and failover policies without changing it.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"max_monthly_cost_usdc":{"type":"number","exclusiveMinimum":0,"maximum":100000},"required_regions":{"maxItems":8,"type":"array","items":{"type":"string","minLength":2,"maxLength":32}},"minimum_replicas":{"type":"integer","minimum":1,"maximum":12}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_infrastructure_node","kind":"act","impl":"imperative","description":"Add exactly one supported semantic component from the shared catalog at deterministic coordinates. Never invent a type outside the schema. Analyze first to avoid overlap; for multi-step changes, prefer propose_architecture_plan.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"type":{"type":"string","enum":["client","service","api-gateway","load-balancer","database","cache","storage","queue","external-system","auth-service","worker","group","note"]},"x":{"type":"number","minimum":-5000,"maximum":5000},"y":{"type":"number","minimum":-5000,"maximum":5000},"config":{"type":"object","properties":{"region":{"type":"string","minLength":2,"maxLength":32},"size":{"type":"string","minLength":2,"maxLength":40},"replicas":{"type":"integer","minimum":1,"maximum":12},"env_vars":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":64},"additionalProperties":{"type":"string","maxLength":500}},"technology":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":500},"owner":{"type":"string","minLength":1,"maxLength":80},"environment":{"type":"string","minLength":1,"maxLength":40},"custom_properties":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":64},"additionalProperties":{"type":"string","maxLength":500}},"input_ports":{"maxItems":16,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"output_ports":{"maxItems":16,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"label":{"type":"string","minLength":1,"maxLength":64}},"additionalProperties":false}},"required":["type","x","y"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"move_node","kind":"act","impl":"imperative","description":"Move one existing node to exact canvas coordinates. node_id accepts a permanent ID, short reference such as N4, or an unambiguous label.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"node_id":{"type":"string","minLength":1,"maxLength":128},"x":{"type":"number","minimum":-5000,"maximum":5000},"y":{"type":"number","minimum":-5000,"maximum":5000}},"required":["node_id","x","y"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_node","kind":"act","impl":"imperative","description":"Remove one existing node and all attached edges. node_id accepts an ID, short reference, or unambiguous label. This mutation is undoable.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"node_id":{"type":"string","minLength":1,"maxLength":128}},"required":["node_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"connect_nodes","kind":"act","impl":"imperative","description":"Create a validated directional connection. Each endpoint accepts a permanent ID, short reference such as N4, or an unambiguous label.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"source_id":{"type":"string","minLength":1,"maxLength":128},"target_id":{"type":"string","minLength":1,"maxLength":128},"connection_type":{"type":"string","enum":["data","request","event","replication","dependency"]}},"required":["source_id","target_id","connection_type"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"disconnect_nodes","kind":"act","impl":"imperative","description":"Remove one directional connection. Each endpoint accepts a permanent ID, short reference, or unambiguous label.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"source_id":{"type":"string","minLength":1,"maxLength":128},"target_id":{"type":"string","minLength":1,"maxLength":128}},"required":["source_id","target_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_node_config","kind":"act","impl":"imperative","description":"Update a node's common semantic metadata, label, technology, ownership, environment, ports, region, sizing, replicas, custom properties, and/or environment variables. node_id accepts an ID, short reference, or unambiguous label.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"node_id":{"type":"string","minLength":1,"maxLength":128},"region":{"type":"string","minLength":2,"maxLength":32},"size":{"type":"string","minLength":2,"maxLength":40},"replicas":{"type":"integer","minimum":1,"maximum":12},"env_vars":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":64},"additionalProperties":{"type":"string","maxLength":500}},"technology":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":500},"owner":{"type":"string","minLength":1,"maxLength":80},"environment":{"type":"string","minLength":1,"maxLength":40},"custom_properties":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":64},"additionalProperties":{"type":"string","maxLength":500}},"input_ports":{"maxItems":16,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"output_ports":{"maxItems":16,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"label":{"type":"string","minLength":1,"maxLength":64}},"required":["node_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"group_nodes","kind":"act","impl":"imperative","description":"Create a system boundary around existing nodes. Boundaries cannot be nested. References accept permanent IDs, short references, or unambiguous labels.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"node_ids":{"minItems":1,"maxItems":24,"type":"array","items":{"type":"string","minLength":1,"maxLength":128}},"label":{"default":"System Boundary","type":"string","minLength":1,"maxLength":64}},"required":["node_ids"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_group_members","kind":"act","impl":"imperative","description":"Replace the complete member list of an existing system boundary. Omitted previous members are safely detached, not deleted.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"group_id":{"type":"string","minLength":1,"maxLength":128},"node_ids":{"maxItems":24,"type":"array","items":{"type":"string","minLength":1,"maxLength":128}}},"required":["group_id","node_ids"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_group_collapsed","kind":"act","impl":"imperative","description":"Collapse or expand a system boundary without deleting its members or connections.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"group_id":{"type":"string","minLength":1,"maxLength":128},"collapsed":{"type":"boolean"}},"required":["group_id","collapsed"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"auto_layout_architecture","kind":"act","impl":"imperative","description":"Arrange every live node into a deterministic layer- or region-based pattern and fit the canvas.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"direction":{"default":"LR","type":"string","enum":["LR","TB"]},"group_by":{"default":"layer","type":"string","enum":["layer","region"]}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"simulate_region_outage","kind":"act","impl":"imperative","description":"Start or recover a regional outage. Affected nodes and traffic paths are highlighted without provisioning anything.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"region":{"type":"string","minLength":2,"maxLength":32},"mode":{"default":"start","type":"string","enum":["start","recover"]}},"required":["region"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"undo_last_change","kind":"act","impl":"imperative","description":"Revert the most recent canvas mutation as one atomic action.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"redo_last_change","kind":"act","impl":"imperative","description":"Replay the most recently undone human or agent mutation as one atomic action.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_architecture_plan","kind":"act","impl":"imperative","description":"Preview a strict multi-operation architecture plan with a cost diff. The human must approve the in-page proposal before changes apply atomically.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"summary":{"type":"string","minLength":8,"maxLength":240},"max_monthly_cost_usdc":{"type":"number","exclusiveMinimum":0,"maximum":100000},"operations":{"minItems":1,"maxItems":24,"type":"array","items":{"oneOf":[{"type":"object","properties":{"action":{"type":"string","const":"add_node"},"ref":{"type":"string","minLength":1,"maxLength":64},"type":{"type":"string","enum":["client","service","api-gateway","load-balancer","database","cache","storage","queue","external-system","auth-service","worker","group","note"]},"x":{"type":"number","minimum":-5000,"maximum":5000},"y":{"type":"number","minimum":-5000,"maximum":5000},"config":{"type":"object","properties":{"region":{"type":"string","minLength":2,"maxLength":32},"size":{"type":"string","minLength":2,"maxLength":40},"replicas":{"type":"integer","minimum":1,"maximum":12},"env_vars":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":64},"additionalProperties":{"type":"string","maxLength":500}},"technology":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":500},"owner":{"type":"string","minLength":1,"maxLength":80},"environment":{"type":"string","minLength":1,"maxLength":40},"custom_properties":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":64},"additionalProperties":{"type":"string","maxLength":500}},"input_ports":{"maxItems":16,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"output_ports":{"maxItems":16,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"label":{"type":"string","minLength":1,"maxLength":64}},"additionalProperties":false}},"required":["action","ref","type","x","y"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"move_node"},"node_id":{"type":"string","minLength":1,"maxLength":128},"x":{"type":"number","minimum":-5000,"maximum":5000},"y":{"type":"number","minimum":-5000,"maximum":5000}},"required":["action","node_id","x","y"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"remove_node"},"node_id":{"type":"string","minLength":1,"maxLength":128}},"required":["action","node_id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"connect_nodes"},"source_ref":{"type":"string","minLength":1,"maxLength":128},"target_ref":{"type":"string","minLength":1,"maxLength":128},"connection_type":{"type":"string","enum":["data","request","event","replication","dependency"]}},"required":["action","source_ref","target_ref","connection_type"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"disconnect_nodes"},"source_id":{"type":"string","minLength":1,"maxLength":128},"target_id":{"type":"string","minLength":1,"maxLength":128}},"required":["action","source_id","target_id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"update_node"},"node_id":{"type":"string","minLength":1,"maxLength":128},"config":{"type":"object","properties":{"region":{"type":"string","minLength":2,"maxLength":32},"size":{"type":"string","minLength":2,"maxLength":40},"replicas":{"type":"integer","minimum":1,"maximum":12},"env_vars":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":64},"additionalProperties":{"type":"string","maxLength":500}},"technology":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":500},"owner":{"type":"string","minLength":1,"maxLength":80},"environment":{"type":"string","minLength":1,"maxLength":40},"custom_properties":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":64},"additionalProperties":{"type":"string","maxLength":500}},"input_ports":{"maxItems":16,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"output_ports":{"maxItems":16,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"label":{"type":"string","minLength":1,"maxLength":64}},"additionalProperties":false}},"required":["action","node_id","config"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"group_nodes"},"ref":{"type":"string","minLength":1,"maxLength":64},"label":{"type":"string","minLength":1,"maxLength":64},"node_refs":{"minItems":1,"maxItems":24,"type":"array","items":{"type":"string","minLength":1,"maxLength":128}}},"required":["action","ref","label","node_refs"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"set_group_members"},"group_ref":{"type":"string","minLength":1,"maxLength":128},"node_refs":{"maxItems":24,"type":"array","items":{"type":"string","minLength":1,"maxLength":128}}},"required":["action","group_ref","node_refs"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"set_group_collapsed"},"group_ref":{"type":"string","minLength":1,"maxLength":128},"collapsed":{"type":"boolean"}},"required":["action","group_ref","collapsed"],"additionalProperties":false}]}}},"required":["summary","operations"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"provision_and_pay","kind":"transact","impl":"imperative","description":"Verify the supplied total and optional architecture hash against the live graph, request human approval, then mock-settle via x402.","title":"Provision architecture and authorize x402 payment","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"total_cost_usdc":{"type":"number","exclusiveMinimum":0,"maximum":100000},"architecture_hash":{"type":"string","minLength":8,"maxLength":64}},"required":["total_cost_usdc"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Developer Tools","apiSurface":"spec","toolCount":20}}