{"serverId":"mcp-registry/ai.dataecho/mcp","tools":[{"name":"app_status","fixed":{"name":"app_status","description":"Build/run status of a container app deployed via publish_site with a Dockerfile. Poll until status is `live` or `failed`.","inputSchema":{"type":"object","required":["slug"],"properties":{"logs":{"type":"boolean","description":"Include build logs"},"slug":{"type":"string","description":"Site slug"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":102,"tokensAfter":102},{"name":"create_drive","fixed":{"name":"create_drive","description":"Create a new private drive.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Drive name"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":60,"tokensAfter":60},{"name":"delete_site","fixed":{"name":"delete_site","description":"Permanently delete an owned site. Irreversible — confirm with the user first.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"Site slug"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":74,"tokensAfter":74},{"name":"delete_variable","fixed":{"name":"delete_variable","description":"Delete an account variable.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Variable name"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":62,"tokensAfter":62},{"name":"drive_delete_file","fixed":{"name":"drive_delete_file","description":"Delete one file from a drive.","inputSchema":{"type":"object","required":["drive","path"],"properties":{"path":{"type":"string","description":"File path"},"drive":{"type":"string","description":"Drive name or drv_… id"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":82,"tokensAfter":82},{"name":"drive_list_files","fixed":{"name":"drive_list_files","description":"List files in a drive (by drive name or drv_… id), optionally under a path prefix.","inputSchema":{"type":"object","required":["drive"],"properties":{"drive":{"type":"string","description":"Drive name or drv_… id"},"prefix":{"type":"string","description":"Path prefix filter"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":98,"tokensAfter":98},{"name":"drive_move_file","fixed":{"name":"drive_move_file","description":"Move/rename a file inside a drive.","inputSchema":{"type":"object","required":["drive","from","to"],"properties":{"to":{"type":"string","description":"New path"},"from":{"type":"string","description":"Current path"},"drive":{"type":"string","description":"Drive name or drv_… id"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":99,"tokensAfter":99},{"name":"drive_read_file","fixed":{"name":"drive_read_file","description":"Read a file from a drive. Text comes back as utf-8 `content`; binary as `contentBase64`. Files over 1 MB are refused (use the skill scripts).","inputSchema":{"type":"object","required":["drive","path"],"properties":{"path":{"type":"string","description":"File path in the drive"},"drive":{"type":"string","description":"Drive name or drv_… id"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":116,"tokensAfter":116},{"name":"drive_revoke_token","fixed":{"name":"drive_revoke_token","description":"Revoke a drive share token.","inputSchema":{"type":"object","required":["drive","tokenId"],"properties":{"drive":{"type":"string","description":"Drive name or drv_… id"},"tokenId":{"type":"string","description":"dtok_… id from drive_tokens"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":89,"tokensAfter":89},{"name":"drive_write_file","fixed":{"name":"drive_write_file","description":"Write/overwrite one file in a drive (ETag-safe: pass ifMatch to assert the version you read, otherwise the current version is used automatically).","inputSchema":{"type":"object","required":["drive","path"],"properties":{"path":{"type":"string","description":"Destination path in the drive"},"drive":{"type":"string","description":"Drive name or drv_… id"},"content":{"type":"string","description":"UTF-8 text content"},"ifMatch":{"type":"string","description":"Optional ETag precondition"},"contentType":{"type":"string","description":"Optional MIME type"},"contentBase64":{"type":"string","description":"Base64 content for binary files"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":199,"tokensAfter":199},{"name":"get_site","fixed":{"name":"get_site","description":"Full details + current file manifest of an owned site.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"Site slug"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":66,"tokensAfter":66},{"name":"list_drives","fixed":{"name":"list_drives","description":"List the authenticated account's private cloud drives.","inputSchema":{"type":"object","required":[],"properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":52,"tokensAfter":52},{"name":"list_sites","fixed":{"name":"list_sites","description":"List all sites owned by the authenticated account.","inputSchema":{"type":"object","required":[],"properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":50,"tokensAfter":50},{"name":"list_variables","fixed":{"name":"list_variables","description":"List account variable NAMES (values are write-only — they are injected into proxy calls and container apps, never read back).","inputSchema":{"type":"object","required":[],"properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":72,"tokensAfter":72},{"name":"platform_info","fixed":{"name":"platform_info","description":"DataEcho platform overview: what it can host, auth state of this connection, docs links. Call this first if unsure.","inputSchema":{"type":"object","required":[],"properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":69,"tokensAfter":69},{"name":"publish_site","fixed":{"name":"publish_site","description":"Deploy files to a live URL. No slug → create a NEW site (works without auth; anonymous sites expire in 24h — always show the user the claimUrl). With slug → UPDATE that site (complete snapshot: send ALL files). A Dockerfile in the files makes it a server-side app (auth required; listen on process.env.PORT; persist under /data; poll app_status). Total payload ≤ 8 MB — for bigger sites use the dataecho skill scripts.","inputSchema":{"type":"object","required":["files"],"properties":{"spa":{"type":"boolean","description":"Enable SPA fallback routing (serve index.html for unknown paths)"},"slug":{"type":"string","description":"Existing site slug to update (omit to create a new site)"},"files":{"type":"array","items":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Site-relative path, e.g. index.html or assets/app.js"},"content":{"type":"string","description":"UTF-8 text content (use for html/css/js/json/text)"},"contentType":{"type":"string","description":"Optional MIME type; guessed from the extension if omitted"},"contentBase64":{"type":"string","description":"Base64 content (use for binary files)"}},"additionalProperties":false},"description":"Files to publish. Each file: { path, content (utf-8 text) OR contentBase64 (binary), contentType? }. The publish is a COMPLETE snapshot — omitted files are removed on update."},"title":{"type":"string","description":"Viewer page title (used when there's no index.html)"},"claimToken":{"type":"string","description":"Claim token — required to update an anonymous site without auth"},"ttlSeconds":{"type":"number","description":"Expiry for authenticated sites, in seconds"},"description":{"type":"string","description":"Viewer page description"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":505,"tokensAfter":505},{"name":"search_sites","fixed":{"name":"search_sites","description":"Full-text search across the authenticated account's sites (names, metadata, and text content).","inputSchema":{"type":"object","required":["query"],"properties":{"limit":{"type":"number","description":"Max results (optional)"},"query":{"type":"string","description":"Search query"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":98,"tokensAfter":98},{"name":"set_variable","fixed":{"name":"set_variable","description":"Create/update a write-only account secret (uppercase name). Injected as env vars into container apps and as ${VAR} into proxy calls. Optionally pin which upstream hosts may receive it.","inputSchema":{"type":"object","required":["name","value"],"properties":{"name":{"type":"string","description":"UPPER_SNAKE_CASE variable name"},"value":{"type":"string","description":"Secret value (never readable back)"},"allowedUpstreams":{"type":"array","items":{"type":"string"},"description":"Optional allow-list of upstream hosts"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":165,"tokensAfter":165},{"name":"update_site_metadata","fixed":{"name":"update_site_metadata","description":"Patch site settings without redeploying: viewer title/description, SPA mode, TTL, password (string sets, null removes).","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"Site slug"},"title":{"type":"string","description":"Viewer title"},"spaMode":{"type":"boolean","description":"SPA fallback routing"},"password":{"type":"string","description":"Password-gate the site; pass an empty string to REMOVE the password"},"ttlSeconds":{"type":"number","description":"Expiry in seconds (null-like 0 not allowed; omit to keep)"},"description":{"type":"string","description":"Viewer description"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":200,"tokensAfter":200}],"toolsChanged":19,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}