The MCP Server Your Team Forgot Was Running with Prod Credentials
A new engineer joined the team on Monday. By Wednesday, she had a working local agent setup: an MCP server bridged to the company's deployment API, pointed at staging, talking to her editor. The onboarding doc walked her through the OAuth flow. The token she pasted into the server's environment file was the one her teammate had emailed her — the same token the CI pipeline uses to ship to staging. By Friday, she had joined the team for a working session at a coworking space.
The MCP server was still running. Bound to 127.0.0.1. No authentication. The token was loaded into the process. She didn't think about it because she was not using it. But any tab that visited any website that day could speak to her local server through her own browser. So could any other laptop on the coworking wifi, because she had not noticed that the server was actually bound to 0.0.0.0. The OAuth token your CI pipeline uses to push to staging was now reachable by anyone who could trick a browser into making a request to a local IP — which, in 2026, is a one-pop-up problem.
This post is about that class of failure: the gap between "I'm developing on my laptop" and "my laptop is a server reachable by adversaries." MCP servers, by design, sit right in that gap. Most teams have not noticed.
The Mental Model That No Longer Holds
Engineers have been running things on localhost for thirty years. The unstated assumption is always the same: localhost means me, and only me. If I bind a dev server to port 8080, the only thing that can talk to it is another program on my laptop, and the only programs on my laptop are programs I chose to run.
That model was already wrong before MCP. It was wrong when web frameworks introduced live-reload servers that exposed source maps. It was wrong when Docker Desktop opened daemon ports for convenience. But MCP makes the wrongness operationally interesting in a new way, because MCP servers are not passive resources — they are RPC endpoints whose entire point is to act on behalf of the user with the user's credentials.
There are three things that change the threat model the moment you install an MCP server with a real token in it:
First, the server now holds a credential that grants production-relevant access. Even if you tell yourself it's "just staging," the same OAuth client is often configured against the same identity provider, with the same refresh token chain, and the same scopes that the CI pipeline uses. The token in your dotfile is not a sandbox — it is your team's deploy key.
Second, the server is an HTTP endpoint, or it is bridged to one. The MCP STDIO transport is local by design, but mcp-remote, MCP Inspector, and dozens of community proxies happily put an HTTP face on a STDIO server so editors and browser-based clients can connect. That HTTP face speaks unauthenticated by default in many distributions, because "it's only localhost." See above for why that phrase has lost its meaning.
Third, the browser is now part of the threat surface in a way it never was for, say, your Postgres dev instance. Postgres does not speak HTTP. MCP HTTP bridges do. Any tab that loads JavaScript can attempt a fetch() to http://127.0.0.1:8765 and — under the right conditions — get back a 200 with your real data inside.
DNS Rebinding Is Not Hypothetical Anymore
The technique that makes the above attack real is DNS rebinding, and the reason to take it seriously now is that the MCP SDK ecosystem has been disclosing and patching versions of it through 2025 and into 2026.
The attack works because there are two security checks in the browser, and they happen at different times. When a script on attacker.example tries to call attacker.example/api, the browser's same-origin policy permits it. The DNS lookup returns the attacker's real IP. The connection succeeds. So far, completely normal.
Now the attacker's DNS server changes its mind. The next time the browser looks up attacker.example, it gets 127.0.0.1. From the browser's perspective, the script is still calling attacker.example/api — the same origin it has been calling all along. The same-origin policy does not re-evaluate. The TCP connection, however, now lands on the developer's local machine. The MCP server, which only checks whether the request came from a browser at all, replies.
The Anthropic TypeScript SDK shipped a default-on Host header check in version 1.24.0 specifically to close this hole. The Python SDK shipped its equivalent in 1.23.0. Anything older — and that includes a lot of pinned versions in lockfiles that were created in early 2025 — accepts requests where the Host header is set to whatever the attacker wants, which is the whole game. Microsoft's Playwright MCP server had a separate CVE for the same class of bug, which gave the malicious tab a full browser-automation toolkit running with the developer's session cookies.
The mitigation list is short and unglamorous:
- Update the MCP SDK to a version that enforces Host header validation by default.
- Bind to
127.0.0.1explicitly. Never bind to0.0.0.0on a developer machine, ever. - Require authentication on every MCP HTTP endpoint, even on localhost. This is the part most teams skip because it feels excessive for a dev tool.
- If you operate a corporate DNS resolver, configure it to drop responses that resolve external names to RFC1918 addresses.
- https://rafter.so/blog/mcp-dns-rebinding-localhost
- https://authzed.com/blog/timeline-mcp-breaches
- https://www.obsidiansecurity.com/blog/when-mcp-meets-oauth-common-pitfalls-leading-to-one-click-account-takeover
- https://aembit.io/blog/the-ultimate-guide-to-mcp-security-vulnerabilities/
- https://www.oligo.security/blog/critical-rce-vulnerability-in-anthropic-mcp-inspector-cve-2025-49596
- https://github.com/modelcontextprotocol/typescript-sdk/security/advisories/GHSA-w48q-cv73-mx4w
- https://www.varonis.com/blog/model-context-protocol-dns-rebind-attack
- https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices
- https://www.docker.com/blog/mpc-horror-stories-cve-2025-49596-local-host-breach/
- https://vulnerablemcp.info/vuln/cve-2025-66414-66416-dns-rebinding-mcp-sdks.html
