{"ok":true,"site":{"host":"atlas.paperclips.workers.dev","url":"https://atlas.paperclips.workers.dev/","type":"live","desc":"Explore spatial datasets with DuckDB, a globe, and WebMCP.","tools":[{"name":"inspect_workspace","kind":"act","impl":"imperative","description":"List available DuckDB relations, whether each is loaded, saved query results, globe layers, and the active result. Use this first to understand the current spatial workspace.","title":"Inspect workspace","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"inspect_relation","kind":"act","impl":"imperative","description":"Inspect one dataset or saved result before writing SQL. Returns schema, inferred geographic/time roles, row count, sample rows, and source provenance.","title":"Inspect relation","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"relation":{"type":"string","description":"Relation, result ID, or saved result relation."}},"required":["relation"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"load_dataset","kind":"act","impl":"imperative","description":"Load an HTTPS CSV/Parquet URL or up to 500 inline records into DuckDB as a named relation. Include source and license details so the workspace can preserve provenance.","title":"Load dataset","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Short SQL-safe relation name; it will be normalized."},"url":{"type":"string","description":"Public HTTPS CSV or Parquet URL. Must allow browser CORS."},"format":{"type":"string","enum":["csv","parquet"],"description":"Remote file format. Inferred from URL if omitted."},"records":{"type":"array","maxItems":500,"description":"Small JSON records supplied directly by the agent.","items":{"type":"object"}},"sourceTitle":{"type":"string","description":"Human-readable dataset or source title."},"sourceUrl":{"type":"string","description":"Canonical page that documents inline records."},"organization":{"type":"string","description":"Source organization or publisher."},"license":{"type":"string","description":"Dataset license or usage terms."}},"required":["name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"execute_sql","kind":"act","impl":"imperative","description":"Run one read-only SELECT/WITH query across available DuckDB relations. Referenced bundled datasets load on demand. Saves a capped result, updates the result table, and records SQL lineage for rendering.","title":"Execute SQL","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"sql":{"type":"string","description":"DuckDB SELECT or WITH query. File, network, DDL, and mutation operations are blocked."},"title":{"type":"string","description":"Short title for the result and result panel."}},"required":["sql"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"render_globe_scene","kind":"act","impl":"imperative","description":"Present an explanation as a headline, subheadline, and up to eight declarative globe layers. Each layer references a saved SQL result and maps columns to visual roles.","title":"Render globe scene","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"headline":{"type":"string","maxLength":120,"description":"Specific conclusion or subject shown prominently over the globe."},"subheadline":{"type":"string","maxLength":220,"description":"One concise sentence explaining what is shown and why it matters."},"layers":{"type":"array","minItems":1,"maxItems":8,"description":"Ordered back-to-front scene layers. The last layer also becomes the active table result.","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80,"description":"Stable scene-unique layer ID."},"resultId":{"type":"string","maxLength":80,"description":"Saved result ID returned by execute_sql."},"type":{"type":"string","enum":["points","paths","rings","polygons"],"description":"Normalized spatial mark type."},"title":{"type":"string","maxLength":120,"description":"Compact label used in the globe legend."},"encoding":{"type":"object","description":"Result columns assigned to visual roles. Geographic roles are inferred when omitted.","properties":{"latitude":{"type":"string","description":"Latitude column."},"longitude":{"type":"string","description":"Longitude column."},"altitude":{"type":"string","description":"Optional altitude in kilometers above the Earth reference ellipsoid."},"geometry":{"type":"string","description":"GeoJSON Polygon or MultiPolygon geometry column."},"group":{"type":"string","description":"Series or path identifier column."},"order":{"type":"string","description":"Path point ordering column."},"label":{"type":"string","description":"Hover and selection label column."},"size":{"type":"string","description":"Optional numeric ring-size column."},"image":{"type":"string","description":"Optional image URL or bundled image-path column for previews."}},"additionalProperties":false},"style":{"type":"object","description":"Validated fixed styling. Width and animate affect paths; radius affects points or rings.","properties":{"color":{"type":"string","maxLength":60,"description":"CSS color; omit for deterministic group colors."},"opacity":{"type":"number","minimum":0.1,"maximum":1,"description":"Layer opacity."},"width":{"type":"number","minimum":0.1,"maximum":4,"description":"Path stroke width."},"radius":{"type":"number","minimum":0.05,"maximum":20,"description":"Point radius or ring maximum radius."},"animate":{"type":"boolean","description":"Whether path dashes move."}},"additionalProperties":false}},"required":["id","resultId","type"],"additionalProperties":false}},"camera":{"type":"object","description":"Initial camera behavior after the scene is committed.","properties":{"fit":{"type":"string","enum":["all-layers","active-layer","none"],"description":"Fit every layer, one layer, or preserve the camera."},"layerId":{"type":"string","maxLength":80,"description":"Layer to fit when fit is active-layer; defaults to the last layer."}},"additionalProperties":false}},"required":["headline","subheadline","layers"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"present_result","kind":"act","impl":"imperative","description":"Bring a saved result into the visible table, open a 1-based page, optionally select a 0-based row, and fit the globe. Use after rendering to focus the user's attention.","title":"Present result","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"resultId":{"type":"string","description":"Saved result ID returned by execute_sql."},"page":{"type":"integer","minimum":1,"description":"One-based result page."},"selectedIndex":{"type":"integer","minimum":0,"description":"Optional zero-based row index to select."},"fit":{"type":"boolean","description":"Fit the globe to the result when no row is selected."}},"required":["resultId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Developer Tools","apiSurface":"spec","toolCount":6}}