<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sz-chrome-remote-extension.git/mcp, branch master</title>
<subtitle>pi-chrome, patched to drive a signed-in browser on another host through a broker, with an MCP server
</subtitle>
<id>https://git.soarez.net/sz/sz-chrome-remote-extension.git/atom?h=master</id>
<link rel='self' href='https://git.soarez.net/sz/sz-chrome-remote-extension.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-extension.git/'/>
<updated>2026-10-15T22:11:41+00:00</updated>
<entry>
<title>mcp: pi-chrome-mcp joins the fork as sz-chrome-remote-extension, loading the fork's own extension</title>
<updated>2026-10-15T22:11:41+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-10-15T22:11:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-extension.git/commit/?id=2a3854c2e246d38636779c2c8dea7cd368f0fe4b'/>
<id>urn:sha1:2a3854c2e246d38636779c2c8dea7cd368f0fe4b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>pi-chrome 0.15.57: stand in for pi-tui, collect the primer from prompt sections</title>
<updated>2026-10-15T05:49:35+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-10-15T05:49:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-extension.git/commit/?id=cc86d6114291305fcea1ed8b0904c8be0e633767'/>
<id>urn:sha1:cc86d6114291305fcea1ed8b0904c8be0e633767</id>
<content type='text'>
</content>
</entry>
<entry>
<title>pi: native MCP instead of pi-mcp-adapter</title>
<updated>2026-10-02T03:31:21+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-10-02T03:31:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-extension.git/commit/?id=50c251e082b8122bfd1a6e80427d0dc19fa4f246'/>
<id>urn:sha1:50c251e082b8122bfd1a6e80427d0dc19fa4f246</id>
<content type='text'>
pi 0.99+ ships MCP as a built-in, and the adapter suppresses it. The gate moves
from the adapter's approval event, which the built-in never emits, to pi's own
tool_call hook on mcp__&lt;server&gt;__*, which every call passes through, codemode
included. approveTools went with the adapter, so nothing backs the gate up: a
decision it cannot reach now denies rather than throws. server.mjs also treats
a client named plain "pi" as pi, which is how the built-in introduces itself.

From change request 562974, filed from the work laptop.
</content>
</entry>
<entry>
<title>ship the pi side we actually run, not a different arrangement</title>
<updated>2026-09-25T13:42:26+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-09-25T13:42:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-extension.git/commit/?id=66dcc84d51bed88cbfb608b9dc6800a8edd32b3c'/>
<id>urn:sha1:66dcc84d51bed88cbfb608b9dc6800a8edd32b3c</id>
<content type='text'>
The README told pi users to install pi-chrome directly and run /chrome
authorize every session. That is not how this is used: pi reaches the same MCP
server through pi-mcp-adapter, with pi's own pi-chrome switched off, which is
why nobody types /chrome authorize.

pi/browser-gate.ts is that setup's missing piece, generalised from the one in
use: it answers pi-mcp-adapter's approval broker for one server, asking once per
session instead of once per call (the adapter's own grant only covers identical
arguments, so for a browser it asks nearly every time). /browser authorize,
/browser revoke, and PI_BROWSER_AUTHORIZE for headless runs. approveTools stays
on in mcp.json as the backstop if the gate does not load.

The README now leads with that: install the adapter, register the server in
mcp.json, copy the gate. Installing pi-chrome in pi is kept as the alternative,
with what it costs - two definitions of the browser, /chrome authorize per
session, and the trap of loading the extension twice.

Tested on an isolated pi config against a stand-in browser: with
PI_BROWSER_AUTHORIZE the call reaches the browser, without it the gate denies it.
</content>
</entry>
</feed>
