Someone clicked around the page and left ten comments. There are two ways to get those comments to an agent that can act on them — as a file, or over MCP.
| JSON export | MCP server | |
|---|---|---|
| How the agent gets it | You download a file and point the agent at it | The agent calls a tool with the share link |
| Per-comment detail | CSS selector, the element, computed styles, the CSS rules that matched, the ancestor chain | CSS selector and the comment text |
| Needs the extension | Yes — the export is produced in the browser | No — the server answers from the stored review |
| Works for comments someone else left |
Yes, if you open their review link and export from it | Yes — their link is all the agent needs |
| Good for | CSS and layout fixes, where the matched rules save the agent a hunt | Working straight from a link a client or tester sent you |
The difference in detail is not a limitation anyone chose — it is where the data
comes from. Computed styles and matched CSS rules exist only in a browser with a
live layout engine. The extension has one, so its export carries them. The server
has no layout engine, so the MCP payload marks itself honestly as a subset
(producer: "server", targetDetail: "none"). For an agent
working inside your repository that is usually fine: the CSS is right there,
unminified.
In the popup, Export comments as JSON — available both while you
are annotating and while you are viewing a shared review. You get
wft-comments-<host>-<date>.json.
Every comment in it carries the selector of the element it is about, what that element is, its computed styles, the CSS rules that matched it and its ancestor chain. That is enough for an agent to go from "this heading is too tight on mobile" to the rule in the stylesheet without ever opening a browser.
Drop the file in your repo and ask for the batch:
I exported feedback comments from a website review tool as wft-comments-example.com-2026-09-27.json.
For each comment in the file:
1. Skip it if target.found is false (note it instead — the element is gone).
2. Use target.selector and target.element to find the matching markup/component in this repo.
3. Use target.matchedRules[].source to find the stylesheet, and target.matchedRules[].selector
to find the rule to edit — target.styles is the computed result, not what to copy in.
4. Apply the fix described in the comment's "text".
Report back which comments you fixed, which you couldn't map to a file, and which were skipped.
formatVersion before it starts, and treat
target.found: false as a hard stop for that comment rather than
reconstructing the element from coordinates. The full field reference is in the
JSON format documentation.
If the review already exists as a share link, the agent can read it itself. The MCP
server exposes one tool, get_review, which takes the share link (or the
bare review id) and returns the review as JSON: page URL and title, capture time,
viewport, and the numbered comments with their CSS selectors.
uv run --with 'mcp>=2.0.0' --with 'httpx>=0.27.0' python wft_mcp.py
Two environment variables configure it:
WFT_API_BASE — the API host, default
https://website-feedback-tool.com. Note this is not the host
in the share link: shared snapshots are served from a separate sandbox origin that
deliberately answers nothing but /reviews/*.WFT_TIMEOUT — seconds, default 20.Then the conversation is just the link:
Read this review and fix what it asks for:
https://website-feedback-tool.com/reviews/<id>
The server directory doubles as a Claude plugin — the MCP server plus a
fix-review skill that tells the model what to do with a review once it
has one. It is a thin client over the same export endpoint the file download uses,
so the two can never drift apart. Want the server? Email
privacy@website-feedback-tool.com
and we'll send it over.
Start with the export. It needs no setup beyond a download, and it carries the most detail per comment — which is exactly what matters for the CSS and layout nits that make up most design feedback.
Reach for MCP when the feedback arrives as a link rather than a file: a client reviewed staging and sent you a URL, and you would rather say "read this and fix it" than open the review, export it and attach the file. Nothing stops you doing both — the MCP payload is a subset of the same format, so an agent written against one understands the other.