
Feedthrough
io.github.feedthroughPublished by GitHub account feedthroughv0.4.0Updated Oct 24, 2026
Debug bridge inside your web app: an agent reads the DOM, console and network. Any browser.
Overview
Embeds a debug bridge in a running web page so an AI agent can read DOM, console and network data and drive the page.
- What you can do
- Feedthrough injects a bridge into a running web page and exposes it as MCP tools over stdio. Tools include query_dom, inspect_element, get_html, get_console_logs, get_network_requests, get_page_info and connection_status for inspection, plus click, fill, hover, press_key, set_style, set_attribute, set_text and reset_overrides for interaction. It works with any browser and with framework adapters for Vite, Next.js, Nuxt, SvelteKit, Remix, Webpack, Cypress and Playwright.
- When to use it
- Use it when debugging a web app in development and you want an agent to inspect live DOM state, console errors and network traffic, or to click and fill inputs and observe the result. It suits local dev workflows where the page already runs in your own browser rather than a separate controlled browser.
- Requirements
- Node.js 22 or newer and npx to run the npm package @feedthrough/mcp locally over stdio. The bridge package must be injected into the page, typically through a build-tool adapter. The WebSocket server binds to 127.0.0.1 on port 8765 by default; FEEDTHROUGH_PORT overrides the port and FEEDTHROUGH_ALLOWED_HOST_SUFFIXES controls which non-loopback origins may connect. No accounts or API keys are declared.
Installation
In SourceWeft
- Open Feedthrough in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Feedthrough
Debug with AI — from inside your app.
Feedthrough injects a lightweight debug bridge into any running web page, then exposes everything — DOM state, console logs, network requests, and user interactions — as MCP tools. Any MCP-compatible AI agent can inspect and drive the page conversationally, in real time.
The name
Many physics and chemistry experiments run inside a sealed vacuum chamber, with all the air pumped out so nothing contaminates the experiment. The catch: you still need to control instruments inside the chamber and read their measurements, and the smallest air leak ruins the run. A feedthrough is the part that solves this — a specially engineered connector that carries electrical signals through the chamber wall while keeping the vacuum perfectly intact. You can't reach inside, but the feedthrough lets you observe and control what's happening in there anyway.
The parallel is exact: Feedthrough extracts runtime debug data from inside a running web app without disturbing it, and sends control signals back in — clicks, keystrokes, DOM queries — without breaking the execution environment.
Why Feedthrough?
Every other browser MCP tool is an external observer — it controls the browser from outside via Puppeteer or CDP and only works in Chrome. Feedthrough is an embedded agent. It runs inside the page, so it sees:
- Framework internals (React component trees, Redux store, custom globals)
- Any browser, not just Chrome
- Your existing dev workflow — no separate controlled browser to launch
- Cypress's own browser context during test runs
Packages
Framework support
Quick start
1. Start the MCP server
The server listens for browser connections on ws://127.0.0.1:8765 and exposes MCP tools on
stdio. Override the port with FEEDTHROUGH_PORT=9000. If the port is already taken, the server
steps up to the next free one rather than refusing to start — see
Running several sessions at once.
2. Add it to your MCP client config
3. Inject the bridge into your page
Vite + React / Vue / Solid / Preact:
Next.js:
Nuxt 3:
SvelteKit:
Remix:
Webpack:
Cypress:
Playwright:
Or manually (any bundler):
4. Open your page and start asking
Once the bridge connects you'll see [feedthrough] tab connected in the MCP server output.
For the simplest experience, keep a single tab open. Multiple tabs can connect at the same time
and commands are routed to the most recently active one, but a single tab avoids any ambiguity.
Then ask your AI agent:
MCP tools
Live edit is a preview, not a save. set_style / set_attribute / set_text mutate the
running DOM so the agent can show you a fix without a rebuild. They are not written to your
source and reset on reload/HMR. The loop: the agent previews live, you confirm, then it edits the
actual source to make it stick. Changes a framework owns (text, controlled attributes) may be
overwritten on the next render — the tool result flags this so the agent can tell you.
Example app
examples/react-app is a small React app with three deliberate bugs — a good sandbox for
trying out the diagnostic workflow:
Connect an AI agent and ask it to find what's wrong. The three bugs are all invisible from the
UI but findable in under a minute via get_console_logs, get_network_requests, and query_dom.
Running several sessions at once
Two AI agent sessions on one machine each start their own Feedthrough MCP server, and only one of them can have port 8765. That is handled, but it is worth knowing how.
The server moves, and tells you where it went. On a busy port it steps up (8766, 8767, …)
instead of failing. connection_status() reports the port it actually bound, and the agent
passes that to the dev server it starts:
Every build-tool adapter — vite, webpack, nextjs, nuxt, sveltekit, remix — reads FEEDTHROUGH_PORT
(or FEEDTHROUGH_URL for a full ws:// URL) in Node at config-load time and bakes the result into
the injected bridge. So a committed, argument-free feedthrough() pairs correctly in any session,
with no file edits. An explicit serverUrl option always wins over the environment.
If you start the dev server yourself, the environment is unset and the page falls back to 8765, which may be another session's server. Either export the port before starting it, or pin one per project (below).
Pinning a port per project. For a project you always work on in its own session, pin the port
on both ends and neither has to think about it. In .mcp.json:
and in the app's config, feedthrough({ serverUrl: "ws://localhost:8770" }).
Telling bridges apart. Each server picks a readable name at startup (quiet-olive-heron) and
sends it to every page that connects. The page logs one line to the browser console, stores it on
window.__feedthrough.server, and returns it from get_page_info(). The agent's own name comes
from connection_status(). Two different names mean the tab is paired with another session's
server — so "am I driving the right app?" is one call, not something you notice by watching the
wrong window change.
Using with an AI agent
Recommended workflow
connection_status()— confirm the bridge is connected before anything elseget_console_logs()— errors and app output often identify the root cause immediatelyget_network_requests()— look for failed fetches, wrong URLs, or missing callsquery_dom(selector)— find elements and check what's renderedinspect_element(selector)— deep-dive on a specific elementclick()/fill()— interact, then re-check logs and network
Project-memory snippet
Add this to whatever project-memory file your AI agent reads — CLAUDE.md for Claude Code,
.cursor/rules/*.md for Cursor, and so on — to prime it with the right workflow:
Sample system prompt
For one-off sessions with any MCP client:
Security
v1 is local-only. Two guards enforce this:
- Localhost binding — the WebSocket server binds to
127.0.0.1, so it is not reachable from other machines on the network. - Origin validation — each incoming WebSocket connection is checked against its
Originheader. Loopback origins (localhost,127.0.0.1,::1) are always accepted, as is any host ending with an allowed suffix (default.test, so local dev domains like Laravel Valet'smyapp.testconnect out of the box). Override the suffix list withFEEDTHROUGH_ALLOWED_HOST_SUFFIXES(comma-separated; replaces the default — set it empty for loopback-only). Any other origin is rejected. A.testorigin can only be presented by a page actually served from a.testhost, which resolves locally, so this widens which local origins connect, not network reach.
What gets captured
Captured network requests include request and response bodies and headers, including
Authorization, Cookie, and any other headers your app sends. That's intentional — debugging
auth and session flows needs them. But the data does leave the page over the local WebSocket,
flows through the MCP server, and reaches whichever AI agent you've connected. If that agent is
cloud-backed, sensitive values reach the provider. Run Feedthrough only on dev machines and dev
data. Do not inject @feedthrough/core into production builds.
Development
Requires Node.js ≥ 22 and pnpm.
Releasing
Packages are versioned independently — bump only the package(s) you actually changed and leave
the rest alone. Publishing to npm is handled by CI: the Publish to npm workflow runs on every
published GitHub Release and publishes only the packages whose name@version isn't on npm yet,
skipping the ones already published (via OIDC trusted publishing, no tokens).
To cut a release:
The workflow builds all packages and publishes only the newly bumped ones. It also publishes
@feedthrough/mcp to the official MCP registry
(io.github.feedthrough/feedthrough) via GitHub OIDC whenever the registry is missing the current
version, so a failed registry publish can be retried by re-running the workflow (Actions tab,
"Run workflow") with no version bump. Mark a release as a pre-release to skip publishing.
License
MIT — see LICENSE.
Source: README.md at commit 2fbf986
Tools
0Version history
1- v0.4.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts