Browser Feedback MCP
Allows exporting collected browser feedback as GitHub issues, enabling users to create pre-filled issues directly from the feedback widget.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Browser Feedback MCP Let me show you a bug on the checkout page"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Browser Feedback MCP for Claude Code
A Model Context Protocol (MCP) server that enables visual browser feedback collection directly into Claude Code. Users can point at elements in their browser and send annotated feedback that Claude can act on immediately.
How It Works
┌─────────────────────────────────────────────────────────────────┐
│ Your Web App (localhost:3000) │
│ │
│ [Widget delivered by browser extension] │
│ │
│ ┌──────────────────┐ │
│ Your App UI │ Add annotation │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
WebSocket
▼
┌─────────────────────────────────────────────────────────────────┐
│ browser-feedback-mcp server (localhost:9877) │
└─────────────────────────────────────────────────────────────────┘
│
MCP Protocol
▼
┌─────────────────────────────────────────────────────────────────┐
│ Claude Code │
│ │
│ "Let me annotate" → installs widget → waits → receives feedback│
└─────────────────────────────────────────────────────────────────┘Related MCP server: annotation-overlay-mcp
Installation
1. Install the MCP Server
# Clone the repository
git clone https://github.com/itk-dev/mcp-claude-code-browser-feedback.git
cd mcp-claude-code-browser-feedback
# Install dependencies
npm install2. Add to Claude Code
claude mcp add --scope user browser-feedback node /path/to/mcp-claude-code-browser-feedback/src/server.jsOr add manually to your Claude Code MCP configuration:
{
"mcpServers": {
"browser-feedback": {
"command": "node",
"args": ["/path/to/mcp-claude-code-browser-feedback/src/server.js"],
"env": {
"FEEDBACK_PORT": "9877"
}
}
}
}3. Install the Browser Extension
The extension delivers the widget to any tab with a single toggle — no changes to your project's files. Ask Claude to run the setup_extension tool, which opens the extension folder and shows instructions, or install manually:
Chrome
Navigate to
chrome://extensionsEnable Developer Mode (toggle in top right)
Click Load unpacked
Select the
extension/folder from this repository
Firefox
Navigate to
about:debugging#/runtime/this-firefoxClick Load Temporary Add-on...
Select
extension/manifest.jsonfrom this repository
Usage
Basic Workflow
Turn the widget on for your app's tab via the extension:
Click the extension icon in your browser toolbar
Toggle the widget ON for the current tab — the "Add annotation" button appears without any file changes
Toggle OFF to cleanly remove the widget
The extension connects to the MCP server at http://localhost:9877 by default (configurable in the popup) and auto-matches the tab to your Claude Code session by project URL.
Then tell Claude you want to show it something:
You: There's a bug with the checkout button, let me show you
Claude: [Calls: wait_for_browser_feedback]
Click "Add annotation" in your browser, then click on the
problematic element.
--- You use the browser widget to select the button ---
Claude: I received your feedback! I can see:
📸 Screenshot captured
🎯 Element: <button class="checkout-btn" disabled>
📝 Your description: "Button stays disabled even with items in cart"
🔴 Console Error: "TypeError: Cannot read property 'items' of null"
Let me look at the checkout code and fix this...Multiple Annotations
You can submit multiple feedback items at once:
You: I have several issues to show you
Claude: [Calls: wait_for_multiple_feedback]
Submit all your annotations, then click "Done" when finished.
--- You submit 3 feedback items, then click Done ---
Claude: I received 3 feedback items. Let me address each one...Offline Export
The widget works without a server connection. When offline, feedback is stored locally and can be exported:
Export Markdown - Click "Pending" to open the queue, then "Export Markdown" to download a
.mdfileCreate GitHub Issue - Click "Create GitHub Issue" to open a pre-filled issue in your browser (you'll be prompted for the repository on first use, stored in localStorage)
Available MCP Tools
Tool | Description |
| Help install the browser extension (opens folder + instructions) |
| Block until user submits single feedback |
| Wait for multiple feedback items (user clicks Done when finished) |
| Get any feedback that's been submitted |
| Preview pending feedback summaries without consuming them |
| Delete a specific pending feedback item by ID |
| Check if browser clients are connected |
| Prompt the user to annotate something specific |
| Open project URL in default browser (auto-detects from config files) |
| Deprecated — auto-inject the widget script into your app's HTML |
| Deprecated — remove the injected widget script |
| Deprecated — get the script tag for manual installation |
Script Installation (deprecated)
Deprecated: Script installation modifies your project's HTML, which produces git noise and risks accidental commits. Use the browser extension instead. This path is kept only for environments where installing a browser extension is genuinely blocked, and will be removed in a future major release (#48).
Add this script tag to your HTML:
<script src="http://localhost:9877/widget.js"></script>The install_widget / uninstall_widget tools still automate injecting and removing the tag (with hostname gating via dev_only / allowed_hostnames and auto-detection of common entry points like public/index.html), and get_widget_snippet returns the tag with your session ID.
Widget Features
Draggable dialog - Move the feedback panel anywhere on screen
Minimizable - Collapse the panel to just the header bar
Collapsible element details - Technical info hidden by default
Screenshot capture - Automatic viewport capture using html2canvas (bundled)
Console log capture - Includes recent console messages
Multi-feedback mode - Submit multiple annotations before sending to Claude
Shadow DOM isolation - Widget styles are isolated from host page CSS
Offline mode - Annotate elements even without a server connection; feedback is stored locally
Export to Markdown - Download pending feedback as a structured Markdown file
Export to GitHub Issue - Open a pre-filled GitHub issue directly from the widget
Configuration
Environment Variables
Variable | Default | Description |
|
| Port for HTTP/WebSocket server |
Screenshot Capture
The widget automatically captures viewport screenshots using html2canvas, which is bundled with the MCP server and loaded on demand. No extra setup is needed.
Troubleshooting
Widget shows "disconnected" (gray button)
Make sure the MCP server is running (check with
/mcpin Claude Code)Check that the port (9877) is not in use by another process
Try restarting Claude Code
Port already in use
The server handles this gracefully - the MCP tools will still work, but you'll need to free the port for the browser widget:
# Find and kill the process using port 9877
lsof -i :9877
kill <PID>Or use a different port:
FEEDBACK_PORT=9878 node src/server.jsNo feedback received
Check browser console for WebSocket errors
Ensure the widget script loaded correctly
Verify the MCP server logs for connection info
Security Notes
The widget only connects to
localhostNo data is sent to external servers
All communication stays on your machine
Note: The HTTP/WebSocket server listens on all interfaces (
0.0.0.0) by default. If you need to restrict this, use a firewall or bind to a specific interface via a reverse proxy.
Development
npm test # Unit tests (vitest)
npm run test:e2e # Widget end-to-end test (requires a Playwright Chromium)The e2e test drives the widget in a headless browser to cover annotation-mode
behavior the unit suite can't reach (iframe selection, Escape handling,
shadow DOM focus). It looks for a Chromium in the Playwright browser cache;
run npx playwright install chromium once, or point PLAYWRIGHT_CHROMIUM
at a browser executable.
License
MIT
Available Tools
12 toolsdelete_pending_feedbackA
Delete a specific pending feedback item by ID. Use this when a user wants to remove feedback they submitted by mistake or that is no longer relevant.
Inputs: id (required).
get_connection_statusB
Check if any browser clients are connected to the feedback server.
Inputs: no named parameters.
get_pending_feedbackA
Get all pending feedback that has been submitted. Use this to collect multiple annotations at once - user can submit several feedback items, then you call this to get them all. Returns an array of feedback items. After receiving, analyze ALL items and take action on each.
Inputs: clear.
get_widget_snippetA
Deprecated — prefer the browser extension (setup_extension). Get the HTML snippet to add to a web app for browser feedback collection.
Inputs: no named parameters.
install_widgetA
Deprecated — prefer the browser extension (setup_extension). Automatically install the feedback widget into a web application by injecting the script tag into an HTML file. Supports auto-detection of common entry points (index.html, etc.) or a specific file path.
Inputs: dev_only, file_path, project_dir, allowed_hostnames.
open_in_browserB
Open the project in the default browser. Automatically detects the project URL from common configuration files (.env, docker-compose.yml, etc.) or accepts an explicit URL. Can also just return the detected URL without opening.
Inputs: url, open, project_dir.
preview_pending_feedbackA
Preview all pending feedback without consuming it. Use this to see what feedback has been submitted without clearing the queue. Returns summaries of pending items (id, timestamp, description, selector). The browser widget also shows this information.
Inputs: no named parameters.
request_annotationA
Send a prompt to connected browsers asking user to annotate something specific. After calling this, use wait_for_browser_feedback ONCE to receive the response. Do not loop - act on the feedback received.
Inputs: message (required).
setup_extensionA
Help the user install the browser extension for widget injection without modifying project files. Opens the extension directory and provides step-by-step instructions for Chrome and Firefox.
Inputs: no named parameters.
uninstall_widgetA
Deprecated — prefer the browser extension (setup_extension). Remove the feedback widget from a web application by removing the injected script tag.
Inputs: file_path, project_dir.
wait_for_browser_feedbackA
Wait for feedback from the browser widget. Blocks until user submits feedback. Returns screenshot, element info, console logs, and description. IMPORTANT: After receiving feedback, DO NOT call this tool again. Instead, analyze the feedback and take action (fix bugs, make changes, etc.). Only call this tool again if the user explicitly asks for more feedback or you need to verify your fix worked.
Inputs: timeout_seconds.
wait_for_multiple_feedbackA
Wait for the user to submit multiple feedback items. Shows a prompt in the browser telling user to submit all their annotations, then click 'Done'. Returns array of all feedback. Use this when user wants to report multiple issues at once.
Inputs: message, timeout_seconds.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
The retrieval tools overlap heavily: wait_for_browser_feedback, wait_for_multiple_feedback, get_pending_feedback, and preview_pending_feedback all return feedback items and differ mainly in blocking/consuming semantics. Descriptions do clarify the distinctions, but an agent could easily pick the wrong one. The three deprecated widget tools also overlap with each other and with setup_extension.
All tools use consistent snake_case verb_noun form (install_widget, get_pending_feedback, wait_for_multiple_feedback, etc.). The pattern is predictable and readable throughout, with no mixed conventions.
12 tools is reasonable for this scope, though three are marked deprecated, leaving effectively nine active tools. The count is slightly inflated by the legacy widget group that is being phased out in favor of the extension.
The domain (browser feedback collection) is well covered: installation/setup, connection status, multiple feedback retrieval modes, deletion, annotation requests, and browser opening. Coverage is strong, with only minor redundancy from the deprecated-but-retained widget tools.
Maintenance
Related MCP Connectors
Client feedback pinned on live sites, Figma frames, PDFs, images and video, for Claude and agents.
Visual feedback from your website's visitors as tasks for your coding agent.
Compare Figma designs against live websites and get visual + content QA reports, from inside Claude.
Comment on AI-generated webpages; feedback flows back to your coding agent. Free, MIT, local-first.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables visual annotation on web pages for Claude Code, allowing element selection, comment addition, screenshot capture, and structured UI feedback for code fixes via an MCP server.MIT
- AlicenseAqualityDmaintenanceEnables DOM-aware visual annotation of web pages with drawing tools and element selection, submitting structured annotations to Claude Code via MCP for automated feedback processing.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables drawing annotations directly on local web pages and sending screenshots, DOM data, and annotation context to your IDE agent for precise code edits.49 npm3MIT
- AlicenseNot gradedqualityBmaintenanceEnables users to draw marks and leave numbered notes on a running localhost page in a Chrome window, then send the batch into the active Claude Code session with each note's element, React component, source line, and screenshot. Progress and per-note results stream back onto the page, and the marks persist across navigation, all locally with no cloud.2MIT