{"ok":true,"site":{"host":"freenet.free","url":"https://freenet.free/","type":"live","desc":"Design how to build a product on Cloudflare or Vercel, watch requests flow and get billed, and let your browser's agent drive the canvas through WebMCP.","tools":[{"name":"get_diagram","kind":"answer","impl":"imperative","description":"Read the current architecture as DSL plus a structured summary (nodes, groups, edges, provider, plan, parse errors). Call this before editing.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_diagram","kind":"act","impl":"imperative","description":"Replace the whole architecture with new DSL. Grammar: `id [kind: <kind>, label: \"...\", attr: value]` for nodes, `group \"Label\" { ... }` for groups, `a > b: \"label\" [ops: 2]` for edges (`ops` = calls per request), `direction right|down`, `title \"...\"`, `provider cloudflare|vercel`. Kinds: client, edge-cache, waf, bot-shield, rate-limit, static, ssr, compute, kv, sql, blob, queue, actor, workflow, vector, llm, ai-gateway, search, cron, realtime, hyperdrive, images, stream, browser, turnstile, email, load-balancer, zaraz, analytics, access, container, flags, sandbox, middleware, external. Prefer patch_diagram for small edits.","inputSchema":{"type":"object","properties":{"dsl":{"type":"string","minLength":1,"maxLength":20000}},"required":["dsl"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"patch_diagram","kind":"act","impl":"imperative","description":"Apply small edits to the architecture: add/remove/set nodes, groups and edges, or set direction/title/provider. Node attrs that matter to the simulator: hit (cache 0..1), cpuMs, bytesKb, rowsRead, writeShare, limitRps, neurons, ops on edges. Third-party services: kind external with attrs { service: \"openai.gpt55_chat\" } (ids from list_services).","inputSchema":{"type":"object","properties":{"ops":{"minItems":1,"maxItems":50,"type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"add_node"},"id":{"type":"string"},"kind":{"type":"string","enum":["client","edge-cache","waf","bot-shield","rate-limit","static","ssr","compute","kv","sql","blob","queue","actor","workflow","vector","llm","ai-gateway","search","cron","realtime","hyperdrive","images","stream","browser","turnstile","email","load-balancer","zaraz","analytics","access","container","flags","sandbox","middleware","external"]},"label":{"type":"string"},"group":{"type":"string"},"attrs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":["string","number","boolean"]}}},"required":["op","id","kind"]},{"type":"object","properties":{"op":{"type":"string","const":"remove_node"},"id":{"type":"string"}},"required":["op","id"]},{"type":"object","properties":{"op":{"type":"string","const":"set_node"},"id":{"type":"string"},"kind":{"type":"string","enum":["client","edge-cache","waf","bot-shield","rate-limit","static","ssr","compute","kv","sql","blob","queue","actor","workflow","vector","llm","ai-gateway","search","cron","realtime","hyperdrive","images","stream","browser","turnstile","email","load-balancer","zaraz","analytics","access","container","flags","sandbox","middleware","external"]},"label":{"type":"string"},"group":{"type":["string","null"]},"attrs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":["string","number","boolean"]}}},"required":["op","id"]},{"type":"object","properties":{"op":{"type":"string","const":"add_group"},"id":{"type":"string"},"label":{"type":"string"},"parent":{"type":"string"}},"required":["op","id"]},{"type":"object","properties":{"op":{"type":"string","const":"remove_group"},"id":{"type":"string"}},"required":["op","id"]},{"type":"object","properties":{"op":{"type":"string","const":"add_edge"},"from":{"type":"string"},"to":{"type":"string"},"label":{"type":"string"},"style":{"type":"string","enum":["arrow","back","both","line","dotted","dotted-arrow"]},"attrs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":["string","number","boolean"]}}},"required":["op","from","to"]},{"type":"object","properties":{"op":{"type":"string","const":"remove_edge"},"from":{"type":"string"},"to":{"type":"string"}},"required":["op","from","to"]},{"type":"object","properties":{"op":{"type":"string","const":"set_direction"},"direction":{"type":"string","enum":["right","down","left","up"]}},"required":["op","direction"]},{"type":"object","properties":{"op":{"type":"string","const":"set_title"},"title":{"type":"string"}},"required":["op","title"]},{"type":"object","properties":{"op":{"type":"string","const":"set_provider"},"provider":{"type":"string","enum":["cloudflare","vercel"]}},"required":["op","provider"]}]}}},"required":["ops"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_templates","kind":"answer","impl":"imperative","description":"List starting-point architectures (id, name, tagline, lesson). Load one with load_template.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"load_template","kind":"act","impl":"imperative","description":"Load a template architecture by id onto the canvas, replacing the current diagram.","inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_products","kind":"answer","impl":"imperative","description":"List the generic product kinds and what each maps to on Cloudflare and Vercel, including gaps where a provider has no first-party product.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare","vercel"]},"category":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"explain_product","kind":"act","impl":"imperative","description":"Explain one product kind on both providers: what it is, when to use it, limits, recommended stack, billing meters, and the counterpart gap.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["client","edge-cache","waf","bot-shield","rate-limit","static","ssr","compute","kv","sql","blob","queue","actor","workflow","vector","llm","ai-gateway","search","cron","realtime","hyperdrive","images","stream","browser","turnstile","email","load-balancer","zaraz","analytics","access","container","flags","sandbox","middleware","external"]}},"required":["kind"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_provider","kind":"act","impl":"imperative","description":"Switch the whole architecture between Cloudflare and Vercel. Nodes are re-labelled and re-priced; the diagram itself does not change.","inputSchema":{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare","vercel"]}},"required":["provider"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_plan","kind":"act","impl":"imperative","description":"Choose which plan to price against: free (Cloudflare Free / Vercel Hobby) or paid (Workers Paid / Vercel Pro).","inputSchema":{"type":"object","properties":{"plan":{"type":"string","enum":["free","paid"]}},"required":["plan"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_traffic_mix","kind":"act","impl":"imperative","description":"Set requests per day and the share of each request class (human, googlebot, ai-crawler, scraper, botnet). Shares are normalised. Omitted fields keep their value.","inputSchema":{"type":"object","properties":{"perDay":{"type":"number","minimum":0,"maximum":10000000000},"shares":{"type":"object","properties":{"human":{"type":"number","minimum":0,"maximum":1},"googlebot":{"type":"number","minimum":0,"maximum":1},"ai-crawler":{"type":"number","minimum":0,"maximum":1},"scraper":{"type":"number","minimum":0,"maximum":1},"botnet":{"type":"number","minimum":0,"maximum":1}}}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_protection","kind":"act","impl":"imperative","description":"Set a gate node's protection mode. Modes: off, bots (block scrapers + botnets), bots+ai (also block AI crawlers), all-bots (also block search crawlers, which hurts SEO). Works on bot-shield, waf and rate-limit nodes.","inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"mode":{"type":"string","enum":["off","bots","bots+ai","all-bots"]}},"required":["nodeId","mode"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_snapshot","kind":"answer","impl":"imperative","description":"Current simulation state: offered traffic by class, what was blocked/dropped, and per-node arrivals. Use it to explain where requests go.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_bill","kind":"answer","impl":"imperative","description":"Projected monthly bill for the current architecture and traffic, priced from the official pricing pages (with source URLs). Optionally for a different provider or plan.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare","vercel"]},"plan":{"type":"string","enum":["free","paid"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"compare_providers","kind":"act","impl":"imperative","description":"Price the same architecture on Cloudflare and Vercel, free and paid, side by side, with the gaps each provider has for the kinds in use.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"explain_charge","kind":"act","impl":"imperative","description":"Explain what drives a meter: which nodes contribute, how much, and which request classes are behind it. Without a meter, explains the top five by monthly volume.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"meter":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"analyze_product","kind":"act","impl":"imperative","description":"Analyse a product from its URL or a description: what it is, the core loop vs polish features, which platform primitives it needs, and a build verdict. Follow with propose_architecture.","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"description":{"type":"string","maxLength":4000}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_architecture","kind":"act","impl":"imperative","description":"Generate an architecture from the last analyze_product result (or from explicit needs flags) and put it on the canvas. Needs: auth, sql, kv, blob, queue, realtime, llm, vector, search, cron, payments, email, ssr.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"needs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}},"provider":{"type":"string","enum":["cloudflare","vercel"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"export_config","kind":"act","impl":"imperative","description":"Generate deployable configuration for the current architecture: wrangler.jsonc and a Worker entry for Cloudflare, or vercel.json and a setup guide for Vercel, plus the recommended stack.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare","vercel"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"describe_studio","kind":"answer","impl":"imperative","description":"Start here. What freenet.free is and how it thinks (request classes, gates, caches, free-tier quotas), a map of the UI, which tool to use for what, common workflows, and the current state: provider, plan, traffic, clock position, view, selection, open blueprint.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_layers","kind":"answer","impl":"imperative","description":"The layer view: every node with the meters it drives, projected monthly volume against the plan's allowance (percent used, over or not), unit cost and what happens past the quota. This is what the timeline tracks and the Inspect overview show.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_simulation_period","kind":"act","impl":"imperative","description":"Choose what the timeline simulates: a day (hours), a month (30 days) or a year (12 months with monthly quota resets). Restarts the clock and starts playing; the whole period plays in about 90 real seconds.","inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["day","month","year"]}},"required":["period"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"control_timeline","kind":"act","impl":"imperative","description":"Drive the timeline: play, pause, reset to the start, or seek to a position given as a fraction of the period (0 = start, 1 = end; seeking pauses). Returns the clock readout. Use seek 1 to jump to the end-of-period totals.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["play","pause","reset","seek","status"]},"at":{"type":"number","minimum":0,"maximum":1}},"required":["action"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_view","kind":"act","impl":"imperative","description":"Arrange the canvas: layout snake (rows that wrap, the default), vertical or horizontal; edge style curved, step or straight; relayout true re-runs auto layout and discards manual nudges.","inputSchema":{"type":"object","properties":{"layout":{"type":"string","enum":["snake","vertical","horizontal"]},"edgeStyle":{"type":"string","enum":["curved","step","straight"]},"relayout":{"type":"boolean"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"focus_node","kind":"act","impl":"imperative","description":"Select a node, centre the canvas on it and open its details in the Inspect panel. Returns the node's product, role, attributes and per-day flow. Pass an empty id to clear the selection.","inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"open_panel","kind":"act","impl":"imperative","description":"Open a right-hand panel: inspect (overview, layers, node details), bill (per-meter lines) or chat (the AI tab), optionally a chat sub-tab: chat, activity (tool log) or alternatives.","inputSchema":{"type":"object","properties":{"panel":{"type":"string","enum":["inspect","bill","chat"]},"chatTab":{"type":"string","enum":["chat","activity","alternatives"]}},"required":["panel"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_alternatives","kind":"answer","impl":"imperative","description":"Third-party and cross-provider alternatives for a product kind, or for every kind on the canvas: what it is on Cloudflare, what it is on Vercel, gaps, and services people use instead.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"kind":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_services","kind":"answer","impl":"imperative","description":"Third-party services you can put on the canvas next to the platform: OpenAI models and tools, Shopify commerce APIs, Netlify hosting primitives. Each has a service id, vendor pricing meters and default consumption per request. Add one with patch_diagram: add_node with kind external and attrs { service: \"openai.gpt55_chat\" }; override a meter with a numeric attr named after it, e.g. { output_tokens: 900 }.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"vendor":{"type":"string","enum":["openai","shopify","netlify"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_blueprints","kind":"answer","impl":"imperative","description":"Saved blueprints in this browser (id, name, provider, plan, node count, where it was remixed from, last updated), and which one is open.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"save_blueprint","kind":"act","impl":"imperative","description":"Save what is on the canvas as a new blueprint (optionally named) and open it, so further edits autosave to it.","inputSchema":{"type":"object","properties":{"name":{"type":"string","maxLength":120}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"open_blueprint","kind":"act","impl":"imperative","description":"Open a saved blueprint by id onto the canvas (replaces the current diagram, provider, plan, traffic and protections).","inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"rename_blueprint","kind":"act","impl":"imperative","description":"Rename the open blueprint (or one by id) and set the diagram title to match.","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"id":{"type":"string"}},"required":["name"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remix_blueprint","kind":"act","impl":"imperative","description":"Duplicate a saved blueprint (by id) or a template (by templateId) into a new blueprint and open it, keeping the original untouched.","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"templateId":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_blueprint","kind":"transact","impl":"imperative","description":"Delete a saved blueprint by id. Cannot be undone; the canvas keeps its current contents.","inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"load_template","kind":"act","impl":"declarative","description":"Load a template architecture by id onto the canvas, replacing the current diagram.","inputSchema":{"type":"object","properties":{"id":{"type":"string","enum":["static-plus-api","saas-sql","media-pipeline","realtime-rooms","ai-rag"]}},"required":["id"]},"__source":"spec","__declarative":true},{"name":"set_provider","kind":"act","impl":"declarative","description":"Switch the whole architecture between Cloudflare and Vercel. Nodes are re-labelled and re-priced; the diagram itself does not change.","inputSchema":{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare","vercel"]}},"required":["provider"]},"__source":"spec","__declarative":true},{"name":"set_plan","kind":"act","impl":"declarative","description":"Choose which plan to price against: free (Cloudflare Free / Vercel Hobby) or paid (Workers Paid / Vercel Pro).","inputSchema":{"type":"object","properties":{"plan":{"type":"string","enum":["free","paid"]}},"required":["plan"]},"__source":"spec","__declarative":true},{"name":"set_traffic_mix","kind":"act","impl":"declarative","description":"Set requests per day and the share of each request class (human, googlebot, ai-crawler, scraper, botnet). Shares are normalised. Omitted fields keep their value.","inputSchema":{"type":"object","properties":{"perDay":{"type":"number"},"human":{"type":"number"},"googlebot":{"type":"number"},"ai-crawler":{"type":"number"},"scraper":{"type":"number"},"botnet":{"type":"number"}}},"__source":"spec","__declarative":true},{"name":"set_protection","kind":"act","impl":"declarative","description":"Set a gate node's protection mode. Modes: off, bots (block scrapers + botnets), bots+ai (also block AI crawlers), all-bots (also block search crawlers, which hurts SEO). Works on bot-shield, waf and rate-limit nodes.","inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"mode":{"type":"string","enum":["off","bots","bots+ai","all-bots"]}},"required":["nodeId","mode"]},"__source":"spec","__declarative":true},{"name":"analyze_product","kind":"act","impl":"declarative","description":"Analyse a product from its URL or a description: what it is, the core loop vs polish features, which platform primitives it needs, and a build verdict. Follow with propose_architecture.","inputSchema":{"type":"object","properties":{"url":{"type":"string"},"description":{"type":"string"}}},"__source":"spec","__declarative":true},{"name":"propose_architecture","kind":"act","impl":"declarative","description":"Generate an architecture from the last analyze_product result (or from explicit needs flags) and put it on the canvas. Needs: auth, sql, kv, blob, queue, realtime, llm, vector, search, cron, payments, email, ssr.","inputSchema":{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare","vercel"]}}},"__source":"spec","__declarative":true},{"name":"get_bill","kind":"answer","impl":"declarative","description":"Projected monthly bill for the current architecture and traffic, priced from the official pricing pages (with source URLs). Optionally for a different provider or plan.","inputSchema":{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare","vercel"]},"plan":{"type":"string","enum":["free","paid"]}}},"__source":"spec","__declarative":true},{"name":"set_simulation_period","kind":"act","impl":"declarative","description":"Choose what the timeline simulates: a day (hours), a month (30 days) or a year (12 months with monthly quota resets). Restarts the clock and starts playing; the whole period plays in about 90 real seconds.","inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["day","month","year"]}},"required":["period"]},"__source":"spec","__declarative":true},{"name":"control_timeline","kind":"act","impl":"declarative","description":"Drive the timeline: play, pause, reset to the start, or seek to a position given as a fraction of the period (0 = start, 1 = end; seeking pauses). Returns the clock readout. Use seek 1 to jump to the end-of-period totals.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["status","play","pause","reset","seek"]},"at":{"type":"number"}},"required":["action"]},"__source":"spec","__declarative":true},{"name":"set_view","kind":"act","impl":"declarative","description":"Arrange the canvas: layout snake (rows that wrap, the default), vertical or horizontal; edge style curved, step or straight; relayout true re-runs auto layout and discards manual nudges.","inputSchema":{"type":"object","properties":{"layout":{"type":"string","enum":["snake","vertical","horizontal"]},"edgeStyle":{"type":"string","enum":["curved","step","straight"]}}},"__source":"spec","__declarative":true},{"name":"focus_node","kind":"act","impl":"declarative","description":"Select a node, centre the canvas on it and open its details in the Inspect panel. Returns the node's product, role, attributes and per-day flow. Pass an empty id to clear the selection.","inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"__source":"spec","__declarative":true},{"name":"open_panel","kind":"act","impl":"declarative","description":"Open a right-hand panel: inspect (overview, layers, node details), bill (per-meter lines) or chat (the AI tab), optionally a chat sub-tab: chat, activity (tool log) or alternatives.","inputSchema":{"type":"object","properties":{"panel":{"type":"string","enum":["inspect","bill","chat"]}},"required":["panel"]},"__source":"spec","__declarative":true},{"name":"save_blueprint","kind":"act","impl":"declarative","description":"Save what is on the canvas as a new blueprint (optionally named) and open it, so further edits autosave to it.","inputSchema":{"type":"object","properties":{"name":{"type":"string"}}},"__source":"spec","__declarative":true},{"name":"describe_studio","kind":"answer","impl":"declarative","description":"Start here. What freenet.free is and how it thinks (request classes, gates, caches, free-tier quotas), a map of the UI, which tool to use for what, common workflows, and the current state: provider, plan, traffic, clock position, view, selection, open blueprint.","inputSchema":{"type":"object","properties":{}},"__source":"spec","__declarative":true},{"name":"get_layers","kind":"answer","impl":"declarative","description":"The layer view: every node with the meters it drives, projected monthly volume against the plan's allowance (percent used, over or not), unit cost and what happens past the quota. This is what the timeline tracks and the Inspect overview show.","inputSchema":{"type":"object","properties":{}},"__source":"spec","__declarative":true},{"name":"list_blueprints","kind":"answer","impl":"declarative","description":"Saved blueprints in this browser (id, name, provider, plan, node count, where it was remixed from, last updated), and which one is open.","inputSchema":{"type":"object","properties":{}},"__source":"spec","__declarative":true},{"name":"compare_providers","kind":"act","impl":"declarative","description":"Price the same architecture on Cloudflare and Vercel, free and paid, side by side, with the gaps each provider has for the kinds in use.","inputSchema":{"type":"object","properties":{}},"__source":"spec","__declarative":true},{"name":"get_snapshot","kind":"answer","impl":"declarative","description":"Current simulation state: offered traffic by class, what was blocked/dropped, and per-node arrivals. Use it to explain where requests go.","inputSchema":{"type":"object","properties":{}},"__source":"spec","__declarative":true},{"name":"get_diagram","kind":"answer","impl":"declarative","description":"Read the current architecture as DSL plus a structured summary (nodes, groups, edges, provider, plan, parse errors). Call this before editing.","inputSchema":{"type":"object","properties":{}},"__source":"spec","__declarative":true},{"name":"export_config","kind":"act","impl":"declarative","description":"Generate deployable configuration for the current architecture: wrangler.jsonc and a Worker entry for Cloudflare, or vercel.json and a setup guide for Vercel, plus the recommended stack.","inputSchema":{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare","vercel"]}}},"__source":"spec","__declarative":true}],"category":"Developer Tools","favicon":"/favicons/freenet.free.svg","apiSurface":"spec","toolCount":54}}