Pinpoint
Pinpoint's MCP server lets a coding agent receive UI annotations that a developer made by pointing at elements in a running app, then ask questions, re-verify the element, and mark each note resolved with a reply.
List pending notes —
get_pending_annotationsreturns all pending annotations (comment, element details, screenshot) as a markdown task list, optionally filtered by page URL.Browse the queue —
list_annotationsgives one line per annotation (pending, resolved, or all).Inspect one note —
get_annotationreturns full detail plus the screenshot by id or pin number.Re-verify against the live page —
recheck_annotationasks the browser to re-find the element now and reports whether it moved or is gone, with a fresh crop.Mark work done —
resolve_annotationcloses a note and requires a written reply describing what changed and where.Ask the developer back —
reply_annotationpauses a note to ask a clarifying question; the answer returns as a new pending note with the conversation.Watch for new notes —
wait_for_annotationblocks until the next annotation arrives, so agents can run a wait → apply → resolve loop (each note goes to exactly one waiting agent).Reset —
clear_annotationsdeletes all pending and resolved annotations.
Firefox support is not yet available; manifest blockers remain (service worker vs scripts background, missing gecko id), so the extension is not usable there.
Reads the iOS Simulator's accessibility tree to let you pick UI elements in native apps (SwiftUI, UIKit, React Native, Flutter), annotate desired changes, and deliver element identifiers, labels, tree paths, and cropped screenshots to a coding agent.
Inspects React component chains and source-file hints for elements picked on a local dev page, giving the agent the component hierarchy behind the selected element.
Supports annotating local dev pages in Safari by building the extension as a small macOS app; picking, regions, comments, pins, screenshots, the bridge, and MCP all work, though React/Vue component chains and source-file hints are unavailable.
Pinpoint
Point at your running app. Say what should change. Your coding agent gets it.
English · తెలుగు · हिन्दी · தமிழ் · 简体中文 · 日本語 · 한국어 · Español · Français · Deutsch · Português · Русский · العربية
Click an element, say what should change, your agent gets it. · full-speed video
Click an element on your local dev site, type what should change, and your coding agent receives it with everything it needs to find the code: the selector, DOM path, computed styles, the React/Vue component chain, a source-file hint and a cropped screenshot. No screenshots piling up in Downloads, no describing "the third button on the left".
It works for behaviour, not only looks. "Disable this until the form is valid" or "save the draft before closing" are fine notes: the agent treats the element as where to start, then follows it into the handlers, state, API calls and backend behind it.
Building a native app? The same works on the iOS Simulator and the Android emulator.
flowchart LR
subgraph you [" You point and type "]
direction TB
B["🌐 <b>Browser</b><br/>Pinpoint extension"]
S["📱 <b>iOS Simulator</b><br/>127.0.0.1:7331/ios"]
AN["🤖 <b>Android emulator</b><br/>127.0.0.1:7331/android"]
end
BR(["📍 <b>Pinpoint bridge</b><br/>127.0.0.1:7331"])
ST[("💾 ~/.pinpoint/<br/>annotations.json")]
F["📄 .pinpoint/pending.md<br/><i>in your repo, optional</i>"]
A["🤖 <b>Your coding agent</b><br/>Claude Code · Cursor · Codex"]
B -- "selector · styles · crop" --> BR
S -- "accessibility tree · crop" --> BR
AN -- "view tree · crop" --> BR
BR -- "MCP / hooks" --> A
A -- "resolve + reply" --> BR
BR -. "live pins & replies" .-> B
BR --- ST
BR -.-> F
classDef bridge fill:#c6f432,stroke:#121212,stroke-width:2px,color:#121212
classDef agent fill:#121212,stroke:#c6f432,stroke-width:2px,color:#ffffff
class BR bridge
class A agent
style you fill:transparent,stroke:#888,stroke-dasharray:5 4Contents
Get Pinpoint: stores, npm, MCP directories
Reference: commands, MCP tools, what a note contains
Related MCP server: redpen
How it compares
Who drives | What the agent gets | |
Pinpoint | You point and say what should change | Selector, styles, component chain, source hint, crop |
Playwright MCP, computer-use | The agent navigates and clicks | Whatever it finds by browsing |
A pasted screenshot | You | Pixels only, so it guesses which control you meant |
Pinpoint never touches the page itself, so it composes with browser automation instead of competing with it: point at the thing, let the agent change the code, let your tests drive the browser.
🔗 Get Pinpoint
Where | Link |
Firefox (140+, desktop) | |
Chrome, Brave, Arc, Opera, Vivaldi | Chrome Web Store listing in review — load it unpacked for now (Quick start) |
Edge | Add-ons listing coming — loads the same package unpacked today |
Safari | Build with Xcode: |
Bridge + MCP server | npm: |
MCP directories | |
Releases | GitHub releases (store zips attached) |
Website & demo | |
Launch |
🚀 Quick start
You need Node 18+ and a Chromium browser (Chrome, Edge, Brave, Arc, Opera, Vivaldi), or Firefox 140+.
1. Install
git clone https://github.com/gowtham012/pinpoint
node pinpoint/bridge/cli.js setupsetup asks a few questions. Every one has a default, so pressing Enter all the way through works.
It wires up Claude Code, Cursor and Codex (whichever you have), installs the Claude Code hooks, and
starts the bridge.
2. Load the extension. Chrome doesn't let a terminal load an extension into your profile, so setup opens the extensions page and copies the folder path for you: turn on Developer mode, click Load unpacked, paste. The terminal confirms ✓ Pinpoint is live in Chrome by itself.
3. Restart Claude Code once, so it reads the new MCP server and hooks.
Try it: open your dev site (or the demo page), press ⌥⇧A / Alt+Shift+A, click an element, type what should change, then ⌘↩ / Ctrl+Enter. Type anything in Claude Code and your note comes along.
Want every step spelled out? Seedocs/quick-install.md.
Only building a native iOS or Android app? Skip the clone:
npx -y pinpoint-bridge, then claude mcp add pinpoint -s user -- npx -y pinpoint-bridge mcp.
setup asks:
which project's UI you want to annotate: the repo your agent will edit
web app, native iOS app, Android app, or both (web and iOS): web gets the browser extension; iOS gets the Simulator picker, Android the emulator picker. Setup checks for Xcode, Maestro and Java (iOS) or adb (Android) and says how to get whichever is missing (it installs none of them).
which agents to wire up:
claude mcp addfor Claude Code,<project>/.cursor/mcp.jsonfor Cursor,~/.codex/config.tomlfor Codex. Existing entries are merged, never replaced, and the TOML file is backed up first.whether to install the Claude Code hooks, which bring pending notes in with your next message
which browser to load the extension into (only the ones you have)
Then it registers the launcher behind the popup's Start bridge button and starts the bridge.
Non-interactive: node pinpoint/bridge/cli.js setup ~/code/my-app --yes (add --for ios,
--for android or --for both; the default is web).
By hand. The order matters: $PWD is baked into the MCP entry, so step 2 runs from
pinpoint/bridge before the bridge takes over the terminal.
# 1. get it
git clone https://github.com/gowtham012/pinpoint
cd pinpoint/bridge && npm install
# 2. wire up Claude Code (once, from this folder)
claude mcp add pinpoint -s user -- node "$PWD/cli.js" mcp
node cli.js install-hooks ~/code/my-app # notes arrive without being asked
node cli.js install-native-host --project ~/code/my-app # optional: the popup's "Start bridge" button
# 3. load extension/ unpacked at chrome://extensions (Developer mode on)
# 4. start the bridge, and leave it running
node cli.js --project ~/code/my-app--project is optional: it keeps <repo>/.pinpoint/pending.md current for agents that read a file
instead of MCP.
file:// pages. Chrome keeps them off by default: chrome://extensions → Pinpoint → Details →
Allow access to file URLs, then reload.
Windows. $PWD works in PowerShell and Git Bash but not cmd.exe; run node cli.js --help and
copy the claude mcp add … line it prints, which has the full path. install-native-host is macOS
and Linux only; on Windows, start the bridge in a terminal.
Also listed on the official MCP Registry
(io.github.gowtham012/pinpoint), cursor.directory
(one-click Add to Cursor) and Glama and mcprush (grade A). Those
install the MCP server only; web pages still need the extension and bridge.
🖱️ Using it
While the bridge runs, a small bar sits in the top-right corner of your page.
|
|
|
Shows the shortcut, and lights up while your agent works. | Settles to a dot after a few seconds. Hover to bring it back. | Picking. The bar lets clicks through so it never blocks your target. |
Click the bar (or ⌥⇧A / Alt+Shift+A) to start marking.
Click an element, or drag a box around a group ("make these cards two-up on mobile").
Type what should change and press ⌘↩ / Ctrl+Enter. You're ready for the next one.
Esc or Stop when you're done.
Move the bar by dragging its grip anywhere on the page; it stays there on that site.
The counter on the bar lists everything marked on this page. Click a row to jump to it.
The × hides the bar for that site; the toolbar popup brings it back.
Pins follow their element on apps that rebuild their DOM, and hide rather than sit on the wrong element when theirs is gone.
No bridge running? Send copies a ready-to-paste prompt instead, so nothing is lost.
Record steps. While picking, press Record steps on the bar and click through the bug as you normally would. Clicks still reach the page and each becomes a step (element, label, URL, a small crop), across navigations in the same tab. Done writes one note (10 steps at most); Esc throws the recording away. Your agent gets them as Steps to reproduce.
Dictate. Press the mic in the comment box and talk; the text is added to what you typed. Chrome and Safari on secure pages (localhost counts); the browser's own speech service does the transcribing. Not on Firefox.
What went wrong comes along. Each note carries the page's uncaught errors and failed requests from the minute before you marked it, redacted in the browser first (query strings, tokens and secrets removed). Only attached when something actually went wrong.
Where it runs. Only on local development pages: localhost, 127.0.0.1, .local / .test /
.localhost hosts, and file:// once allowed. Anywhere else (a staging URL, a LAN address for phone
testing) the toolbar popup turns it on for one tab.
💬 Talking it through
A note is a conversation, not a one-way ticket.
The agent can ask back. If a request is ambiguous it asks instead of guessing. The question shows on the pin (a ?) and as a toast; answer in the notes panel and the note goes back with the whole conversation.
You read the reply in the browser. A finished note stays in the panel with the agent's own note on what it changed. Agents must write one: "done" is not an answer.
Accept / Not quite. When the agent finishes, a card shows its reply with Accept and Not quite. Not quite opens the note again so you can say what is still wrong.
Not quite right later? Every finished note in the panel has Reply…. Say what's still wrong and it reopens.
Before / After. A few seconds after a note is resolved, Pinpoint takes a fresh crop of the element. Done notes in the panel show Before and After side by side.
Drafts. Draft (or ⇧⌘↩) marks something without sending it. Send on the bar hands every draft over at once.
The whole page. While picking, Whole page makes a note about the page itself ("the spacing feels cramped everywhere"), with a screenshot.

When the page moves under a pin, the agent is told the element may be stale instead of being handed
a selector that has gone bad. recheck_annotation looks again right now and returns a fresh crop next
to the original.

The same two notes, twice. The panel is rebuilt from scratch: note 1 re-finds its element among brand-new nodes, note 2 admits it isn't on this view.
Start / restart from the browser. install-native-host registers a tiny launcher with Chrome
(and Brave, Edge, Arc, Chromium, Vivaldi, Opera) and Firefox. The popup's Start bridge then works, and the
↻ on the bar restarts the bridge after you pull a new build. The launcher can do one thing: run
this repo's own cli.js on a port number from the popup's setting, never from the page.
Several agents. Agents introduce themselves over MCP, so the bar names the one working
(claude-code, cursor-vscode, codex) and each reply is attributed. wait_for_annotation hands each
new note to exactly one waiting agent, so two agents share the queue instead of doing the same note.
🔔 How your agent finds out
Three ways, strongest first. Using all three is fine.
How | Setup | |
Hooks (automatic) | Pending notes ride along with your next message. Prints nothing when nothing is pending. |
|
MCP (on request) | The server tells the agent to check whenever you talk about a UI or feature change. | the MCP entry |
Watch loop (hands-off) | Say "watch pinpoint and apply each change as it comes in"; each note arrives the moment you hit Send. | nothing |
The comment is the instruction, and it can be about how something looks or what it does. The more you say about the outcome ("should", "instead of", "when … then …"), the less the agent guesses.
📱 Native iOS apps
A native app has no DOM, so this path reads the accessibility tree. It works for SwiftUI, UIKit, React Native and Flutter apps, with nothing added to your app.
Hover, click, say what should change; your agent gets the identifier, tree path, frame and a crop, asks if it must, and replies when it's done. · full-speed video · vertical
You need Xcode with a booted Simulator and Maestro (which needs Java; a
Homebrew openjdk is found even off your PATH).
With the bridge running, open http://127.0.0.1:7331/ios (setup opens it for you). Hover to see each
element, click one, type, ⌘↩. The agent gets the accessibilityIdentifier (your testID), label,
tree path, frame and a crop. Press R after the app changes.
The picker also shows the agent's side: a ? pin opens its question with a box to answer, and a
finished note shows its reply with Accept and Not quite (reopen it with a follow-up), as in the browser.
No app handy? bash demo/ios/run.sh builds Trailhead, a one-screen SwiftUI demo, with swiftc
alone and launches it on the booted Simulator.
There's no source-file hint or component chain (the tree has neither; give elements an identifier and
the agent greps for it), no styles, and no recheck_annotation. The first load waits ~10 s while
Maestro starts its on-device driver; after that each refresh takes about a second. Every Maestro on
your Mac shares one driver, so if another one restarts it, the bridge starts a fresh Maestro and tries
once more. If the first load takes minutes, close idle Claude Code sessions that have the Maestro MCP
server.
🤖 Android emulator
The same picker as /ios, reading the Android view tree through adb. Nothing is added to your app
and there is no driver to install.
You need adb from the Android SDK (Android Studio installs it) and a running emulator.
With the bridge running, open http://127.0.0.1:7331/android. Hover, click, type, send. The agent
gets the element's resource-id, content-desc, text, class, its place in the view tree and a crop.
node bridge/cli.js setup --for android checks for adb and points you at the picker.
Pinpoint looks for adb in $ANDROID_HOME, $ANDROID_SDK_ROOT and Android Studio's default SDK
folder, then on your PATH. With one emulator running, that one is used. With several, or to read a
physical device, set ANDROID_SERIAL to its serial (as adb devices lists it) and restart the
bridge. A phone is never picked unless you name it. Like iOS, there's no source-file hint, no styles
and no recheck_annotation: give views an id and the agent greps for it.
🔌 Connecting other agents
The simplest entry runs the published package: npx -y pinpoint-bridge mcp. It talks to whichever
bridge is running. Restart the editor afterwards.
{ "mcpServers": { "pinpoint": { "command": "npx", "args": ["-y", "pinpoint-bridge", "mcp"] } } }[mcp_servers.pinpoint]
command = "npx"
args = ["-y", "pinpoint-bridge", "mcp"]HTTP: http://127.0.0.1:7331/mcp (Streamable HTTP, stateless). Windsurf, Cline, Continue, Zed and
Gemini CLI all take a URL.
No MCP: run the bridge with --project <repo> and it keeps <repo>/.pinpoint/pending.md current.
Tell any agent "read .pinpoint/pending.md and apply it"; it finishes each with
node cli.js resolve <id>. Or use Copy prompt in the popover and paste into any chat.
To pin an agent to your clone instead of npm, use the absolute path to cli.js (copy the line
node cli.js --help prints).
🌐 Browsers
Browser | Status |
Chrome, Brave, Arc, Opera, Vivaldi | ✅ Load unpacked. Verified in CI on headless Chromium. |
Edge | ✅ Load unpacked: the same package as Chrome. |
Firefox 140+ | ✅ Install from Firefox Add-ons (desktop). No dictation. |
Safari | ✅ Built with |
Edge takes the Chrome package as is. For Start bridge, run
node bridge/cli.js install-native-host --id <edge id> once (Edge gives the extension its own id).
Firefox 140+. Until the addons.mozilla.org listing is live, load the zip from
about:debugging → This Firefox → Load Temporary Add-on. If Firefox withheld access to local
sites, press Grant access to local sites in the popup. Then run
node bridge/cli.js install-native-host once for Start bridge, or paste the output of
node bridge/cli.js token into the popup.
Safari doesn't take unpacked extensions, so tools/make-safari.sh wraps it in a small macOS app and
prints the four Safari settings to flip (the key one, Develop ▸ Allow Unsigned Extensions, resets
every time Safari quits). Safari doesn't support "world": "MAIN" content scripts, so inspector.js
can't read React fibers or Vue instances: you lose the component chain and source-file hint, and
page errors (they need the MAIN world too). Failed requests come along only where Safari supports
webRequest. Everything else works. Safari has no native host to hand over the bridge token, so the popup asks for
it once: run node bridge/cli.js token and paste the output. For the Mac App Store,
TEAM=<your team id> bash tools/make-safari.sh --release exports a signed build.
📚 Reference
node cli.js [start] start the bridge (default command)
node cli.js mcp run as a stdio MCP server
node cli.js status is it running? how many pending?
node cli.js print pending annotations as markdown (--consume also resolves them)
node cli.js resolve <id...> --note "what you changed"
mark done — the pin disappears and your note is shown as the reply
node cli.js install-hooks [dir] wire up Claude Code
node cli.js install-native-host let the popup's "Start bridge" button start the bridge
(--uninstall removes it; --id <id> allows a second checkout)
node cli.js token print the extension token (Safari asks for it once)
node cli.js clear delete everything
node cli.js --help
http://127.0.0.1:7331/ios the iOS Simulator picker, served by the running bridge
http://127.0.0.1:7331/android the Android emulator picker (needs adb)
--port <n> default 7331, or $PINPOINT_PORT (set the same number in the popup)
--project <dir> mirror pending annotations into <dir>/.pinpoint/
--print echo each new annotation to stdout as it arrives
$PINPOINT_HOME where annotations are stored (default ~/.pinpoint)
$PINPOINT_AFTER_DELAY ms after a resolve before the After crop (default 3000, 0 turns it off)
$ANDROID_SERIAL which Android device to read, when it isn't the one running emulatortool | purpose |
| everything pending as a markdown task list, each with its screenshot |
| one line per annotation |
| full detail + screenshot for one id or pin number |
| re-find the element in the live page and report what changed, with a fresh crop next to the original |
| mark done → the pin disappears in the browser within a second |
| ask the developer a question instead of guessing; their answer comes back as pending, with the conversation |
| block until the developer sends the next one |
| wipe everything |
Resource: pinpoint://pending (markdown).
comment "make this full-width on mobile" ← the only instruction
page url, title, viewport, scroll
element tag, id, classes, a CSS selector built from stable attributes where they exist
(`button[data-action="next"]` rather than `:nth-of-type(2)`; shadow DOM via
"host >>> inner"), DOM path, rendered text, trimmed outerHTML, role/aria/data-*
attributes, bounding box, ~25 computed style properties, and a fingerprint
(tag + text + key attributes) used to verify a pin is still on the right element
+ reuse, when it is one of several: the component and how many times it is on the
page (an estimate on plain HTML), and whether you meant this one or all of them
source framework (react/vue/svelte/angular/astro), component chain,
file:line where the dev build exposes it — or, in a production build, from the
page's own source maps (same origin only; method: "sourcemap")
screenshot PNG of just the element (+8px), long edge ≤1200px
context only when something went wrong: uncaught errors and failed requests from the
minute before, redacted in the browser
steps recorded notes only: up to 10 clicks, each with selector, label, URL and a crop
after on done notes: a fresh crop taken after the resolveFrom the iOS Simulator, element carries the accessibility identifier, label, text, value, tree path
and frame instead; source is ios-native and page.url is ios-simulator://<device name>. From
the Android emulator it is the resource-id, content-desc, text, class, tree path and bounds;
source is android-native and page.url is android-emulator://<avd>.
For exact file:line on React 19 or Next, add a dev-only inspector plugin
(vite-plugin-react-inspector, @react-dev-inspector). Pinpoint reads their data-source
attributes, as well as React's _debugSource/_debugStack and Vue's __file.
🩺 Troubleshooting
The bar only shows while the bridge runs. Check node cli.js status from pinpoint/bridge. If the
bridge is up, the page probably isn't one Pinpoint injects into automatically (see Where it runs):
open the toolbar popup and turn it on for that tab.
chrome://extensions → Pinpoint → Details → Allow access to file URLs, then reload.
The bridge isn't running, or it's on a different port: the popup's Port and the bridge's --port
must match. If node cli.js status says the port answers, but it is NOT the pinpoint bridge,
something else owns it: start the bridge with --port 7332 and set 7332 in the popup.
Usually the bridge is already running in another terminal, so you're done. Otherwise pick a free port as above. Don't run two bridges at once: they share one store file.
The picture is taken just after your comment is stored, so the comment is never lost. If the page navigated or the tab closed in that moment, the note records why. The comment, selector and styles are all still there.
Hooks are read when a session starts: restart once after install-hooks. Check that
<your repo>/.claude/settings.json has two entries containing print --hook and that their path still
exists (moving your clone breaks it; re-run install-hooks). You can always say "apply my pinpoint
annotations".
Run node cli.js install-native-host once (again, if you moved the repo), then quit and reopen the
browser. The launcher bakes in an absolute path to node; if node moved (new nvm version, Homebrew
upgrade), re-run it.
node cli.js clear. ~/.pinpoint/annotations.json is the only state outside your repo.
🔒 Safety and privacy
The bridge listens on
127.0.0.1only and refuses requests carrying a web page'sOrigin.The extension must present the token in
~/.pinpoint/token.Everything scraped from a page is labelled untrusted where it reaches your agent; only your typed comment is presented as an instruction.
Screenshots live inside
~/.pinpoint/annotations.json, not as loose files.
SECURITY.md has the full trust-boundary notes (including why <all_urls> is needed) and
PRIVACY.md says exactly what is collected, where it's stored, and the one place it goes:
the coding agent you connect.
A page to try it on
demo/index.html is a self-contained demo site (no build, no network) with card grids for region
drags, near-identical buttons, a tab panel that rebuilds itself, a dense table and a form.
cd demo && python3 -m http.server 8080 # then open http://localhost:8080🧪 Testing
cd test && npm install && npx playwright install chromium && npm test210 tests. bridge.test.mjs covers the daemon, CLI, hooks, the iOS picker and every MCP tool over
stdio and Streamable HTTP. e2e.test.mjs loads the extension into headless Chromium and drives real
pages: React, Vue, shadow DOM, iframes, strict CSP, a 3,600-node stress page, DPR 2, cross-tab sync and
a form that rebuilds its whole DOM.
file | covers |
| finding adb, picking the device, parsing the view tree, the |
| the |
| Accept, page context, recorded steps, Before / After |
| the page-context redaction rules |
| the Edge upload, the Firefox package and native host, the store zip and the popup's Firefox paths |
| how setup quotes commands for |
See CONTRIBUTING.md.
Roadmap
Native source hints for React Native and Flutter, via an optional dev-only package
CSS source mapping via
chrome.debugger(which rule set this colour, and where)
⭐ Star history
Contributing
Issues and pull requests are welcome; see CONTRIBUTING.md. There's no build step:
clone, npm install in bridge/, load extension/ unpacked. Every behaviour change comes with a test.
Licence
MIT, see LICENSE. Release notes are in CHANGELOG.md.
Available Tools
8 toolsclear_annotationsClear annotationsB
Delete all annotations (pending and resolved).
Inputs: no named parameters.
get_annotationGet one annotationB
Full details and screenshot for a single annotation by id or number.
Inputs: id (required).
get_pending_annotationsGet pending annotationsA
Return every pending annotation (comment + element details + screenshot) as a markdown task list. Use this first.
Inputs: url.
list_annotationsList annotationsB
One-line summary per annotation. Defaults to pending only.
Inputs: status.
recheck_annotationRe-check an annotation against the live pageA
Ask the developer's browser to find this element again, right now, and report what changed since they marked it — with a fresh crop next to the original one. Call it before editing anything marked a while ago, and whenever an annotation says it may be stale. A verdict of gone or moved means the selector in the annotation should not be trusted as-is.
Inputs: id (required), timeoutSeconds.
reply_annotationAsk the developer about a noteA
Ask the developer a question about an annotation instead of resolving it — when the request is ambiguous, or you need a decision before you change code. They read your message on the pin in their browser and answer there; the note then comes back to you as pending with the whole conversation attached (it reaches wait_for_annotation and the Claude Code hook like a new note). Until they answer it is off the pending list. Never use this to report a finished change — that is resolve_annotation.
Inputs: id (required), message (required).
resolve_annotationResolve annotationA
Mark an annotation done after applying the change. Always call this when you have made the change. note is REQUIRED and is not bookkeeping: the developer reads it in their browser as your reply to what they asked for, next to their original note. Say what you actually changed and where — e.g. "Made the field full-width below 640px in Hero.tsx:42 and added the hint text". "Done" or "Fixed" is not an answer. If you could not do it, say that here instead.
Inputs: id (required), note (required).
wait_for_annotationWait for the next annotationA
Block until the developer adds a new annotation in the browser (or timeout). Useful for a live 'watch' loop: wait → apply → resolve → wait. Each new annotation is handed to exactly one waiting agent, so several agents can watch at once without doing the same note twice.
Inputs: timeoutSeconds.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
Each tool has a distinct role in the annotation lifecycle, and descriptions explicitly separate risky pairs like reply_annotation vs resolve_annotation (question vs finished change). The only mild overlap is between list_annotations (one-line summary), get_pending_annotations (full details for all pending), and get_annotation (full details for one), which could occasionally be confused, but the descriptions disambiguate well.
All eight tools follow a predictable snake_case verb_noun pattern targeting the 'annotation' resource (reply_annotation, resolve_annotation, recheck_annotation, get_annotation, clear_annotations, etc.). The only minor deviation is singular vs plural (clear_annotations/list_annotations), which is semantically correct rather than inconsistent.
Eight tools is a tight, well-scoped set that maps cleanly onto the annotation workflow (wait, list, get, recheck, reply, resolve, clear). Every tool earns its place with no redundancy.
The full lifecycle is covered: discovering annotations, inspecting details, checking staleness, asking the developer questions, and resolving. Minor gaps exist — no explicit filtering of resolved annotations or bulk-resolve operation — but these are small workarounds given clear_annotations exists.
Maintenance
Related MCP Connectors
Comment on AI-generated webpages; feedback flows back to your coding agent. Free, MIT, local-first.
Visual feedback from your website's visitors as tasks for your coding agent.
Give agents eyes on any web page: structured context, and changes explained in plain language.
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI coding agents to visually interact with frontend apps by taking screenshots, clicking elements, reading console logs, and performing visual diffs.6 npm3MIT
- AlicenseNot gradedqualityBmaintenanceEnables coding agents to capture pixel-accurate screenshots and DOM state from localhost apps, receive user-drawn instructions and reference images, and manage implementation review cycles.7 npmMIT
- FlicenseNot gradedqualityBmaintenanceConnects a coding agent to a live browser preview of the running app so you can click elements, select text or draw areas, describe what should change, and have the matching source files edited through the cheapest applicable route. Includes annotation queueing via an MCP watch tool, an undo ledger, and a tool that reports uncommitted changes for commit messages.132 npm8-
- AlicenseNot gradedqualityBmaintenanceLets Claude Code read in-browser review comments, element removals, and text/CSS edits made on localhost dev pages, complete with selectors, HTML, React component names, source files, and screenshots. It also lets the agent claim tasks as in progress and submit solutions for the user to accept or reopen.105 npm1MIT


