One companion, many clients
The first companion process to start owns port9223. Every companion started afterwards, by any other client, finds the port taken and becomes a relay: a thin stdio server that forwards tools/list and tools/call to the owner over the HTTP endpoint. From the client’s point of view nothing changes; from the extension’s point of view there is still exactly one connection.
The relay passes the downstream client’s name through, so the owner still knows which agent is calling. Stopping the owner ends the relays too; the next client to start becomes the new owner.
If the port is taken by something that is not a companion, the relay’s handshake fails and the process exits with a message asking you to stop the other process or use
--port. It never guesses a different port on its own, because the extension is configured for one specific port.What is per agent
When two agents both leave
tabId empty, each gets its own most recently opened tab. If neither owns a tab and several tabs are shared, the tool asks for an explicit tabId rather than guessing.
Verifying
bun process listening. pgrep -fl browspark-mcp shows one owner plus one relay per additional stdio client. The dashboard’s Activity page (when the log is on) lists which agent issued each command.