{"ok":true,"site":{"host":"livepreview.liha.dev","url":"https://livepreview.liha.dev/","type":"live","desc":"A stable URL for the build. Reviewers point at what they mean, and the agent in the same tab acts on it through WebMCP.","tools":[{"name":"get_preview_info","kind":"answer","impl":"imperative","description":"Get the preview currently open in this tab: title, artifact type, current version, version count, comment counts and whether it is password protected. Call this first to find out what the user is looking at.","annotations":{"readOnlyHint":true,"title":"Get preview info"},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_share_info","kind":"answer","impl":"imperative","description":"Get everything needed to share this preview somewhere else — the stable share URL, title, current version and open comment count, plus a ready-to-paste one-line summary. Use this when the user asks you to send the preview to a chat, an email or an issue tracker. It never returns the owner token.","annotations":{"readOnlyHint":true,"title":"Get share info"},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_comments","kind":"answer","impl":"imperative","description":"List review comments on the current preview, oldest first. Each entry includes the comment text, who wrote it, the version it was left on, and where it points (CSS selector for web pages, page number for PDFs, normalized coordinates otherwise). Replies follow their parent and carry its id in parentId, so a whole discussion reads in order. Use this to find out what the reviewer wants changed.","annotations":{"readOnlyHint":true,"untrustedContentHint":true,"title":"List comments"},"inputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["open","resolved","all"],"default":"open","description":"Which comments to return. Defaults to \"open\" — the ones still needing work."},"includeOutdated":{"type":"boolean","default":true,"description":"Include comments left on older versions of this preview."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_comment","kind":"answer","impl":"imperative","description":"Get one comment in full, including its annotation geometry and — for web previews — the DOM context captured when the reviewer clicked: CSS selector, tag name, text content, an HTML snippet and the viewport size. Use this to locate the exact element in source before editing.","annotations":{"readOnlyHint":true,"untrustedContentHint":true,"title":"Get comment"},"inputSchema":{"type":"object","properties":{"commentId":{"type":"string","description":"The comment id from list_comments."}},"required":["commentId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_comment","kind":"act","impl":"imperative","description":"Leave a review comment on the current preview, as an agent would during a review pass (\"check this page at mobile width and comment on anything broken\"). Optionally anchor it to a CSS selector or to normalized coordinates (0..1 of the artifact box) so the human sees a marker in the right place. The comment appears in the sidebar immediately.","annotations":{"readOnlyHint":false,"title":"Add comment"},"inputSchema":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":10000,"description":"The comment text."},"authorName":{"type":"string","maxLength":80,"default":"AI agent","description":"Shown as the comment author."},"selector":{"type":"string","description":"CSS selector of the element the comment is about (web previews only)."},"point":{"type":"object","description":"Normalized position of a pin marker, each value between 0 and 1.","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1}},"required":["x","y"],"additionalProperties":false},"page":{"type":"integer","minimum":1,"description":"Page number, for PDF previews."},"replyTo":{"type":"string","description":"Reply in this thread instead of starting a new one. A comment id from list_comments. A reply inherits the thread target."}},"required":["body"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resolve_comment","kind":"act","impl":"imperative","description":"Mark a comment thread as resolved once the requested change has actually been made and a new version published. Resolving a thread resolves its replies with it. Requires the owner token for this preview to be present in this browser. Comments are resolved, never deleted, so the history stays reviewable.","annotations":{"readOnlyHint":false,"title":"Resolve comment"},"inputSchema":{"type":"object","properties":{"commentId":{"type":"string","description":"The comment id from list_comments."}},"required":["commentId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_versions","kind":"answer","impl":"imperative","description":"List every version of this preview, newest first, with its number, size, file count, upload source and whether it is the one currently served at the share URL.","annotations":{"readOnlyHint":true,"title":"List versions"},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_review_summary","kind":"answer","impl":"imperative","description":"One call that returns the whole review state: preview metadata, the current version, the version history and every open comment thread with its target and replies. Counts are per thread. Use this at the start of a fix-the-feedback loop instead of calling the individual read tools one by one.","annotations":{"readOnlyHint":true,"untrustedContentHint":true,"title":"Get review summary"},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"focus_comment","kind":"act","impl":"imperative","description":"Scroll the reviewer's screen to a comment, select it, and outline the element it points at inside the preview. Use it while discussing feedback with someone so you are both looking at the same thing — say which comment you mean, then call this to show them.","annotations":{"readOnlyHint":false,"title":"Show a comment"},"inputSchema":{"type":"object","properties":{"commentId":{"type":"string","description":"The comment id from list_comments."}},"required":["commentId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_viewport","kind":"act","impl":"imperative","description":"Resize the preview the reviewer is looking at, to check how the artifact behaves at a different width. Use it before commenting on responsive problems — switch to mobile, look at what breaks, then leave a comment about it. Applies to web previews only.","annotations":{"readOnlyHint":false,"title":"Set preview width"},"inputSchema":{"type":"object","properties":{"viewport":{"type":"string","enum":["fit","desktop","tablet","mobile"],"description":"fit = the whole window, desktop = 1280px, tablet = 768px, mobile = 390px."}},"required":["viewport"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_artifact_files","kind":"answer","impl":"imperative","description":"List the files in the version currently on screen, with sizes and content types. Use it to find which file to read before working out how to satisfy a comment.","annotations":{"readOnlyHint":true,"title":"List artifact files"},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"read_artifact_file","kind":"answer","impl":"imperative","description":"Read one text file out of the version on screen — the HTML or CSS the reviewer is actually looking at. Use it after list_artifact_files to see the markup behind a comment, so you can name the exact rule or element that needs to change rather than guessing. Binary files are refused.","annotations":{"readOnlyHint":true,"untrustedContentHint":true,"title":"Read artifact file"},"inputSchema":{"type":"object","properties":{"path":{"type":"string","description":"A path from list_artifact_files, for example \"assets/site.css\"."}},"required":["path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_preview_from_url","kind":"act","impl":"imperative","description":"Create a brand new Liha preview from a public URL and return its share URL and owner token. Use this when the user wants to collect review feedback on a page that is already deployed. Private and internal addresses are rejected.","annotations":{"readOnlyHint":false,"title":"Create preview from URL"},"inputSchema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"A public http(s) URL."},"title":{"type":"string","maxLength":200},"password":{"type":"string","minLength":6,"description":"Optional password reviewers must enter."}},"required":["url"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Developer Tools","favicon":"/favicons/livepreview.liha.dev.png","apiSurface":"spec","toolCount":13}}