@tabnav/mcp-local-bridge
v0.1.1
Published
Local MCP server that exposes a localhost port via a Cloudflare Quick Tunnel, so it can be scanned by Tabnav's accessibility MCP tools before it's deployed.
Readme
@tabnav/mcp-local-bridge
A local MCP server with one job: expose a site running on your own machine
(e.g. localhost:3000) through a public HTTPS URL, via a
Cloudflare Quick Tunnel —
no Cloudflare account needed — so it can be scanned by Tabnav's
tabnav-accessibility MCP server before you deploy it.
It doesn't talk to Tabnav's backend and doesn't need your API key. It only opens/closes tunnels; your AI agent chains the two servers together itself.
Install
Nothing to install ahead of time — npx fetches and runs the
published package
on demand:
npx -y @tabnav/mcp-local-bridgeYou won't normally run that yourself; your MCP client runs it for you via the config below. It's shown here just so you can sanity-check it works (it starts an MCP server on stdio and waits — Ctrl+C to stop).
Setup
Add both servers to your MCP client's config (example shown for the JSON config format used by Claude Desktop and similar clients):
{
"mcpServers": {
"tabnav-accessibility": {
"url": "https://api.tabnav.com/mcp/scanning",
"headers": { "Authorization": "Bearer <your-tabnav-api-key>" }
},
"tabnav-local-bridge": {
"command": "npx",
"args": ["-y", "@tabnav/mcp-local-bridge"]
}
}
}Requires Node.js to already be installed (npx ships with it). The first
run downloads a small cloudflared binary for your platform automatically —
no separate install step.
Usage
Once both servers are configured, just ask your agent in plain language, e.g. "scan my local site on port 3000 before I deploy it." It will:
- Call
expose_local_siteontabnav-local-bridgeto get a public URL. - Call
start_site_mapping/start_monitor_scanontabnav-accessibilitywith that URL, exactly as it would for any other domain. - Optionally call
stop_tunnelonce scanning is done.
Tools
expose_local_site({ port, host? })→{ publicUrl, port, host }.hostdefaults tolocalhost; set it to reach another device on your LAN (e.g.192.168.1.223). Re-calling with the same port+host while its tunnel is still open returns the same URL.stop_tunnel({ port, host? })→{ port, host, stopped }.hostmust match what was passed toexpose_local_site, if anything. Any tunnels still open when the bridge process exits are torn down automatically.
Security note
While a tunnel is open, anyone with the URL can reach your local site — the
URL is unguessable but not authenticated. Don't leave one running against a
build with real user data, and prefer stop_tunnel over letting it sit idle.
