MCP, governed like anything else that can write
Boundlane connects to remote MCP servers. Every tool such a server exposes is classified as a high-risk write until a person says otherwise, because the protocol carries nothing the policy layer can decide on.
An MCP server is already a typed tool catalogue, which is most of what the build agent otherwise reconstructs by hand from an API reference. What it does not carry is the part this platform gates on. MCP gives a tool a name, a description and an input schema. It supplies no effect, no risk tier and no reversal — the three properties the promotion gate and the policy dispatcher need before a call is allowed to leave the platform.
What it offers instead is optional annotations, readOnlyHint and destructiveHint among them, and the MCP specification itself says a client must not rely on those for security decisions, because the server supplies them. So Boundlane classifies and the server does not. Every MCP tool starts as a write at high risk, which means it is simulated in shadow and does not execute at any stage that forbids high-risk writes. The server’s own annotations are recorded verbatim next to the classification, as an unverified claim a reviewer reads rather than as an input to the decision. An automation may narrow that by declaring an effect and a risk in its own package, and the gate refuses a bound MCP tool that nobody classified. Silence never means read.
Drift is the other half. An MCP server may change its tool list whenever it likes and merely send a notification, and a connector must not change underneath an automation that was already promoted on evidence. So the binding pins a digest over the tool names and their input schemas. The runtime refuses a mismatch before it dispatches anything, and the promotion gate refuses one computed from the server’s live list. Descriptions sit outside the pin deliberately: they are third-party prose that never reaches a decision, and pinning them would make a copy edit look like an attack.
Two limits, stated rather than discovered. Remote Streamable HTTP only — a stdio server means running a tenant-controlled subprocess on shared infrastructure, which is a different product. And there is no MCP SDK in the dependency tree: the client is JSON-RPC over the same guarded fetch every other connector uses, because a library carrying its own fetch would go around the egress allowlist. Like every connector here, it is tested against realistic responses and has not yet met a live third-party server.